【问题标题】:How avoid calling setApplicationContext on a SpringResourceTemplateResolver?如何避免在 SpringResourceTemplateResolver 上调用 setApplicationContext?
【发布时间】:2016-11-17 13:32:22
【问题描述】:

我目前正在使用 Thymeleaf 设置一个 Spring MVC 项目,遵循以下教程:http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#spring-mvc-configuration

为了亲吻代码,我首先将implements ApplicationContextAware 和setter 方法替换为@Inject private ApplicationContext applicationContext。 但是我不明白为什么我必须在SpringResourceTemplateResolver 上调用setApplicationContext() 而它继承了Spring 接口ApplicationContextAware

如何避免这种情况?

编辑: 如果我删除 templateResolver.setApplicationContext(applicationContext); 行,访问根目录时会出现此异常:

java.lang.IllegalArgumentException: Application Context cannot be null
    org.thymeleaf.util.Validate.notNull(Validate.java:37)
    org.thymeleaf.spring4.templateresource.SpringResourceTemplateResource.<init>(SpringResourceTemplateResource.java:64)
    org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver.computeTemplateResource(SpringResourceTemplateResolver.java:69)
    org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver.computeTemplateResource(AbstractConfigurableTemplateResolver.java:1221)
    org.thymeleaf.templateresolver.AbstractTemplateResolver.resolveTemplate(AbstractTemplateResolver.java:356)
    org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:840)
    org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:608)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1087)
    org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1061)
    org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
    org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:189)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

注意:我使用的是最新版本:Spring 4.3.3.RELEASE 和 Thymeleaf 3.0.2.RELEASE(当然我导入了thymeleaf-spring4)。

【问题讨论】:

  • 这只是一个建议,并不能回答您的问题:您可以尝试将 Spring Boot 与 start.spring.io 一起使用,这将为您生成一个使用 Thymeleaf 和 Spring MVC 的即用型和预配置项目。
  • 你不需要,也不需要注入上下文。春天会照顾它。
  • 感谢@kamwo 的建议,我知道所有 Spring Boot 自动生成的项目。但我想完全了解 Spring Java 配置的工作原理,因为我几乎总是遇到基于 XML 的配置项目(遗留项目......)。以及我自己组织整个项目和依赖项。
  • 在迁移指南中是必需的,因为解析器不是@Bean,如果您按照指南操作,bean 应该是一个 spring bean 并且将被注入。发布您的配置类。
  • @M.Deinum 我正要发布我的配置类,然后发现可能缺少 @Configuration 注释可能是问题的根源。答对了!就是这样……

标签: java spring spring-mvc thymeleaf applicationcontext


【解决方案1】:

重新检查我错过的内容后,似乎缺少的@Configuration 注释是Spring 没有将ApplicationContext 注入SpringResourceTemplateResolver 的来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2019-09-02
    • 2020-10-24
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多