问题见:https://stackoverflow.com/questions/53803497
为什么按照官网上的写法调用@Bean报错:EL1057E: No bean resolver registered in the context to resolve access to bean
有时候我们希望自己去通过thymeleaf进行解析文本,调用自定义的函数。比如
1 2 3 |
Context context = new Context(); context.setVariables(dataMap); templateEngine.process(templateName, context); |
如果我们在模板里使用了 ${@beanName.method()},此时会报错:
1 |
EL1057E: No bean resolver registered in the context to resolve access to bean |
但是如果我们是通过模板进行MVC页面渲染就不会报错,其实原因就是因为此时的context里缺少了spring的Beans的信息,通过spring mvc渲染时,框架会加入这些信息。那么手动渲染时我们也添加Beans的信息就可以了。
1 2 3 4 5 6 |
Context context = new Context(); context.setVariables(dataMap); ThymeleafEvaluationContext tec = new ThymeleafEvaluationContext(applicationContext, null); dataMap.put(ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME, tec); templateEngine.process(templateName, context); |
此时在进行渲染就正常了。
如果想更接近 Spring MVC 解析逻辑的,参考如代码:
1 2 3 4 5 6 7 8 9 10 11 |
@RequestMapping(value = "/uploadApk", produces = "text/javascript") @ResponseBody public String fragUploadApk(@NonNull final HttpServletRequest request, @NonNull final HttpServletResponse response) { final WebContext context = new WebContext(request, response, request.getServletContext(), request.getLocale()); # 此处使用 Spring MVC 默认的 FormattingConversionService.class 完成对数据的格式化(Springboot 2.7.11) final FormattingConversionService conversionService = applicationContext.getBean(FormattingConversionService.class); final ThymeleafEvaluationContext thymeleafEvaluationContext = new ThymeleafEvaluationContext(requireApplicationContext(), conversionService); context.setVariable(ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME, thymeleafEvaluationContext); templateEngine.process(templateName, context); } |
我遇到了同样的问题,并且我的测试环境没有问题,只有在生产环境中出现。
更诡异的是,在我的for循环中,对于同一个模版,这个问题是偶现的,并且我的template.html中,并没有引用Spring Bean。
请问你是否遇到过这种问题?
我遇到了同样的问题,但是我的template.html中并没有用到spring bean。
并且,在一个for循环中调用 emplateEngine.process(new, new);时,这个问题是偶现的
建议关注一下出问题时候的 ClassLoader ,是不是被某个三方依赖替换掉了,最常见的就是某些性能监视软件,他们动作的时候进行AOP注入,导致 Classloader 被换掉了
好的,非常感谢您的建议。我去排查一下
好的,感谢您的建议,我去排查一下