Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
spring boot + thymeleaf 3
spring.thymeleaf.cache=false
#idea flags this as invalid..
spring.thymeleaf.mode=HTML
...snip...
package com.boot;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;
//make sure spring boot doesn't attempt 2.1 config
@SpringBootApplication(exclude={org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration.class} )
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppSecurityApplication.class, args);
}
}
<!-- use snapshot build -->
<repositories>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<!-- make sure you've removed this.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
#resources/META-INF/spring.factories
#bootstrap in your thymeleaf 3 config
org.springframework.boot.autoconfigure.EnableAutoConfiguration=somewhere.outside.app.namespace.thymeleaf.ThymeleafConfig
package somewhere.outside.app.namespace.thymeleaf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties;
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
@Configuration
@ConditionalOnClass({SpringTemplateEngine.class})
@EnableConfigurationProperties({ThymeleafProperties.class}) //no sense rolling our own.
@AutoConfigureAfter({WebMvcAutoConfiguration.class})
public class ThymeleafConfig implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Autowired
private ThymeleafProperties properties;
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setOrder(2147483642);
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
@Bean
//made this @Bean (vs private in Thymeleaf migration docs ), otherwise MessageSource wasn't autowired.
public TemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
return engine;
}
private ITemplateResolver templateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix(this.properties.getPrefix());
resolver.setSuffix(this.properties.getSuffix());
resolver.setTemplateMode(this.properties.getMode());
resolver.setCacheable(this.properties.isCache());
return resolver;
}
}
@tlangeha

This comment has been minimized.

Copy link

commented Jun 24, 2016

Thanks! This was enormously helpful because I was using the template on Thymeleafs website and the few deviations you made from that helped get things running.

@cexowengui

This comment has been minimized.

Copy link

commented Jul 25, 2016

thanks,bro. it is really helpful, finally I get the thymeleaf 3 run, the posts about this on google was drive me nuts. actully, I found there is no need for spring.factories, It works well.

@johnhall

This comment has been minimized.

Copy link

commented Apr 20, 2017

Worked great. All I needed to do was change templateEngine() to return SpringTemplateEngine, add the line engine.addDialect(new Java8TimeDialect()); and add 'org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE' to the dependencies to get support for the LocalDate/LocalDateTime #temporals.format() capabilities. Thanks!

@kameshsampath

This comment has been minimized.

Copy link

commented May 17, 2017

excellent post ! works great! thanks for it

@wrpinheiro

This comment has been minimized.

Copy link

commented May 31, 2017

👍 Thank you for sharing! It surely saved me a lot of time dealing with these configurations :-)

@zhugw

This comment has been minimized.

Copy link

commented Jun 29, 2017

Thanks! And I used 3.0.6.RELEASE(without remove spring-boot-starter-thymeleaf)

		<dependency>
			<groupId>org.thymeleaf</groupId>
			<artifactId>thymeleaf-spring4</artifactId>
			<version>3.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.thymeleaf</groupId>
			<artifactId>thymeleaf</artifactId>
			<version>3.0.6.RELEASE</version>
		</dependency>

I found no need to config below explicitly

spring.thymeleaf.cache=false
#idea flags this as invalid..
spring.thymeleaf.mode=HTML

because it has default value just like this

screen shot 2017-06-29 at 17 03 47

@zhugw

This comment has been minimized.

Copy link

commented Jun 29, 2017

Spring boot 1.5.4 replace default 2.1.5 thymeleaf with 3.0.6

pom.xml

<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring4</artifactId>
	<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf</artifactId>
	<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>nz.net.ultraq.thymeleaf</groupId>
	<artifactId>thymeleaf-layout-dialect</artifactId>
	<version>2.2.2</version>
</dependency>

just need use 3.0.6's dependency override default version, I have proved it works.

@djkeh

This comment has been minimized.

Copy link

commented Jul 25, 2017

@zhugw I'd suggest we still need this option:

spring.thymeleaf.mode=HTML

as the option HTML5 is depreceted in v3.0.0 and will be removed in v3.1.

If you found those default values in org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties, which I checked as well in Spring Boot v1.5.4, the mode field is currently set to HTML5, and I assume it came from Thymeleaf 2. If you're not going to customize auto-configuration class ThymeleafAutoConfiguration to change the default value of it to HTML, you cannot but use the application property above to change it manually. Technically the default value HTML5 stands still for the legacy compatibility and is supposed work exactly same to HTML, so keeping it won't cause any problem for now. But it's RECOMMENDED to change it.

Reference

http://www.thymeleaf.org/apidocs/thymeleaf/3.0.7.RELEASE/org/thymeleaf/templatemode/TemplateMode.html

@antoniolazaro

This comment has been minimized.

Copy link

commented Nov 2, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.