Spring Boot adding thymeleaf-layout-dialect -
i using spring boot (v1.5.3.build-snapshot) new spring boot.
using gradle
note normal thymeleaf dialect works fine (th:...) spring-boot-starter-thymeleaf\1.5.3.build-snapshot
i want add thymeleaf-layout-dialect added dependency
compile('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect')   the documentation says add dialect doing following
templateengine templateengine = new templateengine();  // or  springtemplateengine spring config templateengine.adddialect(new layoutdialect());   so added configuration class
@configuration public class myconfiguration {   @bean public springtemplateengine templateengine(){     springtemplateengine templateengine  = new springtemplateengine();     templateengine.adddialect(new layoutdialect());     return templateengine; } }   but when try running app following error
org.thymeleaf.exceptions.configurationexception: cannot initialize: no template resolvers have been set @ org.thymeleaf.configuration.initialize(configuration.java:203) ~[thymeleaf-2.1.5.release.jar:2.1.5.release] @ org.thymeleaf.templateengine.initialize(templateengine.java:827) ~[thymeleaf-2.1.5.release.jar:2.1.5.release] @ org.thymeleaf.spring4.view.thymeleafview.renderfragment(thymeleafview.java:203) ~[thymeleaf-spring4-2.1.5.release.jar:2.1.5.release] @ org.thymeleaf.spring4.view.thymeleafview.render(thymeleafview.java:190) ~[thymeleaf-spring4-2.1.5.release.jar:2.1.5.release] @ org.springframework.web.servlet.dispatcherservlet.render(dispatcherservlet.java:1282) ~[spring-webmvc-4.3.8.build-snapshot.jar:4.3.8.build-snapshot] @ org.springframework.web.servlet.dispatcherservlet.processdispatchresult(dispatcherservlet.java:1037) ~[spring-webmvc-4.3.8.build-snapshot.jar:4.3.8.build-snapshot] @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:980) ~[spring-webmvc-4.3.8.build-snapshot.jar:4.3.8.build-snapshot] @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:897) ~[spring-webmvc-4.3.8.build-snapshot.jar:4.3.8.build-snapshot] @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:970) ~[spring-webmvc-4.3.8.build-snapshot.jar:4.3.8.build-snapshot]   can tell me how add thymeleaf-layout-dialect correctly?
the issue is:
org.thymeleaf.exceptions.configurationexception: cannot initialize: no template resolvers have been set   to integrate thymeleaf spring, need configure 3 beans:
- thymeleafviewresolver bean - set template engine
 - springtemplateengine bean - set template resolver
 - templateresolver bean
 
in templateengine bean didn't set template resolver, might change templateengine() method following:
@bean public springtemplateengine templateengine(templateresolver templateresolver){     springtemplateengine templateengine  = new springtemplateengine();     templateengine.settemplateresolver(templateresolver);            templateengine.adddialect(new layoutdialect());     return templateengine; }   spring provide templateresolver bean of springtemplateengine.
btw if define spring-boot-starter-thymeleaf dependency, provide thymeleaf-layout-dialect dependency convenient version, spring use thymeleafautoconfiguration.java - spring boot 1.5.x configure default beans 3 required beans.
for example:
layoutdialect bean define here thymeleafweblayoutconfiguration.thymeleafweblayoutconfiguration():
@configuration @conditionalonclass(name = "nz.net.ultraq.thymeleaf.layoutdialect") protected static class thymeleafweblayoutconfiguration {      @bean     @conditionalonmissingbean     public layoutdialect layoutdialect() {         return new layoutdialect();     }  }   springtemplateengine bean defined template resolver , dialect here 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();     (itemplateresolver templateresolver : this.templateresolvers) {       engine.addtemplateresolver(templateresolver);     }     if (!collectionutils.isempty(this.dialects)) {       (idialect dialect : this.dialects) {         engine.adddialect(dialect);       }     }     return engine;   }  }   and thymeleafviewresolver bean defined here 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());     // resolver acts fallback resolver (e.g.     // internalresourceviewresolver) needs have low precedence     resolver.setorder(ordered.lowest_precedence - 5);     resolver.setcache(this.properties.iscache());     return resolver; }   which extended 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());     // resolver acts fallback resolver (e.g.     // internalresourceviewresolver) needs have low precedence     resolver.setorder(ordered.lowest_precedence - 5);     resolver.setcache(this.properties.iscache());     return resolver; }   hope clear now.
Comments
Post a Comment