2017-04-14 50 views
1

我正在使用春季開機(v1.5.3.BUILD-SNAPSHOT) 我是新的春季開機。春季開機添加百里香佈局方言

使用gradle這個

注意,正常thymeleaf方言正常工作(TH:...) 彈簧引導起動thymeleaf \ 1.5.3.BUILD-快照

我想補充thymeleaf -layout方言 我添加的依賴

compile('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect') 

documentation說,通過執行以下操作

012添加的方言

所以我加了一個配置類

@Configuration 
public class MyConfiguration { 


@Bean 
public SpringTemplateEngine templateEngine(){ 
    SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
    templateEngine.addDialect(new LayoutDialect()); 
    return templateEngine; 
} 
} 

但是當我嘗試運行應用程序,我碰到下面的錯誤

org.thymeleaf.exceptions.ConfigurationException: Cannot initialize: no template resolvers have been set 
at org.thymeleaf.Configuration.initialize(Configuration.java:203) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE] 
at org.thymeleaf.TemplateEngine.initialize(TemplateEngine.java:827) ~[thymeleaf-2.1.5.RELEASE.jar:2.1.5.RELEASE] 
at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:203) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE] 
at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190) ~[thymeleaf-spring4-2.1.5.RELEASE.jar:2.1.5.RELEASE] 
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1282) ~[spring-webmvc-4.3.8.BUILD-SNAPSHOT.jar:4.3.8.BUILD-SNAPSHOT] 
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) ~[spring-webmvc-4.3.8.BUILD-SNAPSHOT.jar:4.3.8.BUILD-SNAPSHOT] 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) ~[spring-webmvc-4.3.8.BUILD-SNAPSHOT.jar:4.3.8.BUILD-SNAPSHOT] 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.8.BUILD-SNAPSHOT.jar:4.3.8.BUILD-SNAPSHOT] 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.8.BUILD-SNAPSHOT.jar:4.3.8.BUILD-SNAPSHOT] 

誰能告訴我如何正確添加thymeleaf佈局方言?

+0

你可以檢查是否有幫助:http://stackoverflow.com/questions/43197416/spring-boot-thymeleaf-error-java-lang-classnotfoundexception-org-thymeleaf-do/43203400#43203400 –

回答

0

的問題是:

org.thymeleaf.exceptions.ConfigurationException: Cannot initialize: no template resolvers have been set 

要Thymeleaf與Spring集成,你需要配置3種豆:

  • ThymeleafViewResolver豆 - 你會用一個模板引擎
  • SpringTemplateEngine被設置豆 - 你將被設置一個模板解析器
  • TemplateResolver Bean

在你templateEngine豆你沒有設置任何模板解析器,所以你可能會改變你templateEngine()方法如下:

@Bean 
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver){ 
    SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
    templateEngine.setTemplateResolver(templateResolver);  
    templateEngine.addDialect(new LayoutDialect()); 
    return templateEngine; 
} 

春天將爲您提供一個templateResolver豆的SpringTemplateEngine


BTW如果定義spring-boot-starter-thymeleaf的依賴,它將提供thymeleaf-layout-dialect與便捷的版本存在依賴關係,那麼Spring將使用ThymeleafAutoConfiguration.java - Spring Boot 1.5.x配置默認豆所需的三種豆。

例如:

LayoutDialect bean是定義在這裏ThymeleafWebLayoutConfiguration.ThymeleafWebLayoutConfiguration()

@Configuration 
@ConditionalOnClass(name = "nz.net.ultraq.thymeleaf.LayoutDialect") 
protected static class ThymeleafWebLayoutConfiguration { 

    @Bean 
    @ConditionalOnMissingBean 
    public LayoutDialect layoutDialect() { 
     return new LayoutDialect(); 
    } 

} 

SpringTemplateEngine豆是從這裏ThymeleafWebLayoutConfiguration.ThymeleafDefaultConfiguration()定義的模板解析器和方言:

@Configuration 
@ConditionalOnMissingBean(SpringTemplateEngine.class) 
protected static class ThymeleafDefaultConfiguration { 

    private final Collection<ITemplateResolver> templateResolvers; 

    private final Collection<IDialect> dialects; 

    public ThymeleafDefaultConfiguration(
     Collection<ITemplateResolver> templateResolvers, 
     ObjectProvider<Collection<IDialect>> dialectsProvider) { 
    this.templateResolvers = templateResolvers; 
    this.dialects = dialectsProvider.getIfAvailable(); 
    } 

    @Bean 
    public SpringTemplateEngine templateEngine() { 
    SpringTemplateEngine engine = new SpringTemplateEngine(); 
    for (ITemplateResolver templateResolver : this.templateResolvers) { 
     engine.addTemplateResolver(templateResolver); 
    } 
    if (!CollectionUtils.isEmpty(this.dialects)) { 
     for (IDialect dialect : this.dialects) { 
     engine.addDialect(dialect); 
     } 
    } 
    return engine; 
    } 

} 

最後一個thymeleafViewResolver bean在這裏定義爲AbstractThymeleafViewResolverConfiguration.thymeleafViewResolver()

@Bean 
@ConditionalOnMissingBean(name = "thymeleafViewResolver") 
@ConditionalOnProperty(name = "spring.thymeleaf.enabled", matchIfMissing = true) 
public ThymeleafViewResolver thymeleafViewResolver() { 
    ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
    configureTemplateEngine(resolver, this.templateEngine); 
    resolver.setCharacterEncoding(this.properties.getEncoding().name()); 
    resolver.setContentType(appendCharset(this.properties.getContentType(), 
     resolver.getCharacterEncoding())); 
    resolver.setExcludedViewNames(this.properties.getExcludedViewNames()); 
    resolver.setViewNames(this.properties.getViewNames()); 
    // This resolver acts as a fallback resolver (e.g. like a 
    // InternalResourceViewResolver) so it needs to have low precedence 
    resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 5); 
    resolver.setCache(this.properties.isCache()); 
    return resolver; 
} 

這是由ThymeleafAutoConfiguration.Thymeleaf2ViewResolverConfiguration擴展:

@Bean 
@ConditionalOnMissingBean(name = "thymeleafViewResolver") 
@ConditionalOnProperty(name = "spring.thymeleaf.enabled", matchIfMissing = true) 
public ThymeleafViewResolver thymeleafViewResolver() { 
    ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
    configureTemplateEngine(resolver, this.templateEngine); 
    resolver.setCharacterEncoding(this.properties.getEncoding().name()); 
    resolver.setContentType(appendCharset(this.properties.getContentType(), 
     resolver.getCharacterEncoding())); 
    resolver.setExcludedViewNames(this.properties.getExcludedViewNames()); 
    resolver.setViewNames(this.properties.getViewNames()); 
    // This resolver acts as a fallback resolver (e.g. like a 
    // InternalResourceViewResolver) so it needs to have low precedence 
    resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 5); 
    resolver.setCache(this.properties.isCache()); 
    return resolver; 
} 

希望它現在很清楚。