【问题标题】:Spring Boot - multiple template locationSpring Boot - 多个模板位置
【发布时间】:2017-01-17 18:01:28
【问题描述】:

我希望 Spring 在不同位置查找模板,而不仅仅是在 src/main/resource/templates/。

这里有什么

@Configuration
public class WebConfig{

    @Autowired
    private SpringTemplateEngine templateEngine;

    @PostConstruct
    public void clientTemplate(){
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("static/client");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(templateEngine.getTemplateResolvers().size());
        resolver.setCacheable(false);
        templateEngine.addTemplateResolver(resolver);
    }
}

但是当我尝试访问 /src/main/resources/static/client 中的现有模板 index.html 时,我得到了:

java.lang.IllegalArgumentException: ApplicationContext has not been initialized in resource resolver. TemplateResolver or ResourceResolver might not have been correctly configured by the Spring Application Context.
at org.thymeleaf.util.Validate.notNull(Validate.java:37)
at org.thymeleaf.spring4.resourceresolver.SpringResourceResourceResolver.getResourceAsStream(SpringResourceResourceResolver.java:81)
at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:221)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060)
at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011)
at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

如何解决这个问题?

【问题讨论】:

    标签: spring spring-mvc spring-boot thymeleaf


    【解决方案1】:

    1。非 Spring 管理的 SpringResourceTemplateResolver

    使用您当前的设置,您将在@Bean 方法中创建SpringResourceTemplateResolver 的实例,NOT。因此,它不会在春天被捡起,您需要提供ApplicationContext (example):

    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/templates/");
    resolver.setTemplateMode(TemplateMode.HTML);
    

    注意resolver.setApplicationContext(applicationContext);


    2。 Spring托管的SpringResourceTemplateResolver

    您可能会看到不需要这样做的示例,但他们肯定会在 @Bean 方法中创建 SpringResourceTemplateResolver 实例。 Spring 选择它并为您设置应用程序上下文 (example):

    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCacheable(false);
        return resolver;
    }
    

    【讨论】:

    • 选项 1 不起作用,因为 SpringResourceTemplateResolver 不会将应用程序内容传递给 SpringResourceResourceResolver (我想这是一个 ThymeLeaf 错误)。选项 2 确实工作得很好。
    • @BerthierLemieux 我遇到了这个问题,可能是 2.X 版本的问题。 3.X 似乎没有这个问题。我必须使用 2.X 版本,所以我制作了自己的 SpringResourceTemplateResolver 版本,它允许手动设置应用程序上下文。
    【解决方案2】:

    如果模板解析器未定义为@Bean,ThymeLeaf 会跳闸。你可以用这个替换你的 WebConfig 类。

    @Configuration
    public class WebConfig{
        @Bean
        public ITemplateResolver templateResolver() {
            SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
            resolver.setPrefix("static/client");
            // For Spring Boot
            // resolver.setPrefix("classpath:/templates/");
            resolver.setSuffix(".html");
            resolver.setTemplateMode("HTML5");
            resolver.setCacheable(false);
            return resolver;
        } 
    }
    

    新模板将被拾取并添加到模板解析器列表中,有效地执行与“templateEngine.addTemplateResolver()”相同的操作。

    【讨论】:

      猜你喜欢
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多