Как избежать вызова setApplicationContext для SpringResourceTemplateResolver?

В настоящее время я настраиваю проект Spring MVC с Thymeleaf, следуя руководству по адресу: http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#spring-mvc-configuration

Пытаясь поцеловать код, я сначала заменил implements ApplicationContextAware и метод установки на @Inject private ApplicationContext applicationContext. Но я не понимаю, почему я должен вызывать setApplicationContext() на SpringResourceTemplateResolver, когда он наследует интерфейс 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).


person maxxyme    schedule 17.11.2016    source источник
comment
Это всего лишь предложение, которое не отвечает на ваш вопрос: вы можете попробовать использовать Spring Boot с start.spring.io, который сгенерирует готовый к использованию и предварительно сконфигурированный проект с Thymeleaf и Spring MVC.   -  person kamwo    schedule 17.11.2016
comment
Вам не нужно и не нужно вводить контекст. Весна позаботится об этом.   -  person M. Deinum    schedule 17.11.2016
comment
Спасибо за ваше предложение @kamwo, я знаю обо всех автоматически созданных проектах Spring Boot. Но я хотел полностью понять, как работает конфигурация Spring Java, поскольку я почти всегда сталкивался с проектами конфигурации на основе XML (устаревшие проекты...). А также организовать весь проект и зависимости самостоятельно.   -  person maxxyme    schedule 17.11.2016
comment
@M.Deinum M.Deinum Я пытался раньше, и я получаю исключение, см. Мое редактирование.   -  person maxxyme    schedule 17.11.2016
comment
Также убедитесь, что вы удалили ApplicationContextAware и внедрили ApplicationContext. Если это не сработает, похоже, есть проблема с жизненным циклом внутри Thymeleaf.   -  person M. Deinum    schedule 17.11.2016
comment
@M.Deinum M.Deinum Я эффективно закомментировал @Inject applicationContext (и мой класс конфигурации не реализовал ApplicationContextAware).   -  person maxxyme    schedule 17.11.2016
comment
И это то, что они объясняют в руководстве по переходу на Thymeleaf 3: thymeleaf.org/doc/articles /thymeleaf3migration.html   -  person maxxyme    schedule 17.11.2016
comment
А вы используете самые последние версии библиотек?   -  person M. Deinum    schedule 17.11.2016
comment
В руководстве по миграции это необходимо, потому что преобразователь не является @Bean, если вы следовали руководству, компонент должен быть компонентом Spring и будет внедрен. Опубликуйте свой класс конфигурации.   -  person M. Deinum    schedule 17.11.2016
comment
@M.Deinum M.Deinum Я собирался опубликовать свой класс конфигурации, но обнаружил, что, возможно, отсутствующая аннотация @Configuration может быть источником проблемы. Бинго! Вот и все...   -  person maxxyme    schedule 17.11.2016


Ответы (1)


После повторной проверки того, что я пропустил, оказалось, что отсутствующая аннотация @Configuration является источником того, что Spring не вводит ApplicationContext в SpringResourceTemplateResolver.

person maxxyme    schedule 17.11.2016