2017-04-14 3 views
1

Ich benutze Spring Boot (v1.5.3.BUILD-SNAPSHOT) Ich bin neu zu Spring Boot.Spring Boot hinzufügen thymeleaf-Layout-Dialekt

gradle

verfügt Hinweis, dass der normale thymeleaf Dialekt gut arbeitet (th ...) Feder-boot-Starter-thymeleaf \ 1.5.3.BUILD-snapshot

Ich möchte thymeleaf hinzufügen -layout-Dialekt habe ich die Abhängigkeit

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

die documentation sagt der Dialekt hinzufügen, indem Sie die folgenden Aktionen ausführen

TemplateEngine templateEngine = new TemplateEngine(); // Or 
SpringTemplateEngine for Spring config 
templateEngine.addDialect(new LayoutDialect()); 

So habe ich eine Konfigurationsklasse

@Configuration 
public class MyConfiguration { 


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

aber wenn ich versuche, läuft die App ich folgende Fehlermeldung

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] 
bekommen

kann mir jemand sagen, wie die thymeleaf-Layout-Dialekt hinzuzufügen richtig ?

+0

könnten Sie überprüfen, ob dies hilft: http://stackoverflow.com/questions/43197416/spring-boot-thymeleaf-error-javal-lang-classnotfundexception-org-thymeleaf-do/43203400#43203400 –

Antwort

0

Die Frage ist:

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

Thymeleaf mit Frühling zu integrieren, müssen Sie 3 Bohnen konfigurieren:

  • ThymeleafViewResolver Bean - Sie würden es mit einem Template-Engine
  • SpringTemplateEngine eingestellt werden Bean - Sie würden es mit einer Vorlage Resolver setzen
  • TemplateResolver Bean

In Ihrer templateEngine Bohne haben Sie keine Vorlage Resolver eingestellt, so dass Sie vielleicht Ihre templateEngine() Methode wie folgt ändern:

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

Frühling Sie mit einer templateResolver Bohne von SpringTemplateEngine liefern wird.


BTW Wenn Sie spring-boot-starter-thymeleaf als Abhängigkeit zu definieren, es thymeleaf-layout-dialect als Abhängigkeit mit der komfortablen Version bieten wird, dann wird Frühling ThymeleafAutoConfiguration.java - Spring Boot 1.5.x verwenden, um eine Standard-Bohnen für die drei erforderlichen Bohnen zu konfigurieren.

Zum Beispiel:

LayoutDialect Bohne ist hier ThymeleafWebLayoutConfiguration.ThymeleafWebLayoutConfiguration() zu definieren:

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

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

} 

SpringTemplateEngine Bohne mit einem Template-Resolver und Dialekt von hier ThymeleafWebLayoutConfiguration.ThymeleafDefaultConfiguration() definiert:

@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; 
    } 

} 

Und schließlich ein thymeleafViewResolver Bean ist hier definiert 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; 
} 

, die von ThymeleafAutoConfiguration.Thymeleaf2ViewResolverConfiguration erweitert:

@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; 
} 

Hoffe, dass es jetzt klar ist.