diff --git a/spring-thymeleaf/.classpath b/spring-thymeleaf/.classpath
index 28e4a52cd4..81999ab717 100644
--- a/spring-thymeleaf/.classpath
+++ b/spring-thymeleaf/.classpath
@@ -11,12 +11,6 @@
-
-
-
-
-
-
@@ -28,5 +22,11 @@
+
+
+
+
+
+
diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml
index 1a8dff671e..ae7451a74e 100644
--- a/spring-thymeleaf/pom.xml
+++ b/spring-thymeleaf/pom.xml
@@ -112,6 +112,9 @@
org.apache.maven.plugins
maven-war-plugin
${maven-war-plugin.version}
+
+ false
+
org.apache.maven.plugins
diff --git a/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebApp.java b/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebApp.java
new file mode 100644
index 0000000000..45752a6269
--- /dev/null
+++ b/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebApp.java
@@ -0,0 +1,36 @@
+package org.baeldung.thymeleaf.config;
+
+import javax.servlet.ServletRegistration.Dynamic;
+
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+/**
+ * Java configuration file that is used for web application initialization
+ */
+public class WebApp extends AbstractAnnotationConfigDispatcherServletInitializer {
+
+ public WebApp() {
+ super();
+ }
+
+ @Override
+ protected Class>[] getRootConfigClasses() {
+ return null;
+ }
+
+ @Override
+ protected Class>[] getServletConfigClasses() {
+ return new Class>[] { WebMVCConfig.class };
+ }
+
+ @Override
+ protected String[] getServletMappings() {
+ return new String[] { "/" };
+ }
+
+ @Override
+ protected void customizeRegistration(final Dynamic registration) {
+ super.customizeRegistration(registration);
+ }
+
+}
diff --git a/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebMVCConfig.java b/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebMVCConfig.java
new file mode 100644
index 0000000000..c5bd460eee
--- /dev/null
+++ b/spring-thymeleaf/src/main/java/org/baeldung/thymeleaf/config/WebMVCConfig.java
@@ -0,0 +1,73 @@
+package org.baeldung.thymeleaf.config;
+
+import org.baeldung.thymeleaf.formatter.NameFormatter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Description;
+import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.thymeleaf.spring4.SpringTemplateEngine;
+import org.thymeleaf.spring4.view.ThymeleafViewResolver;
+import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan({ "org.baeldung.thymeleaf" })
+/**
+ * Java configuration file that is used for Spring MVC and Thymeleaf
+ * configurations
+ */
+public class WebMVCConfig extends WebMvcConfigurerAdapter {
+
+ @Bean
+ @Description("Thymeleaf Template Resolver")
+ public ServletContextTemplateResolver templateResolver() {
+ ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
+ templateResolver.setPrefix("/WEB-INF/views/");
+ templateResolver.setSuffix(".html");
+ templateResolver.setTemplateMode("HTML5");
+
+ return templateResolver;
+ }
+
+ @Bean
+ @Description("Thymeleaf Template Engine")
+ public SpringTemplateEngine templateEngine() {
+ SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+ templateEngine.setTemplateResolver(templateResolver());
+
+ return templateEngine;
+ }
+
+ @Bean
+ @Description("Thymeleaf View Resolver")
+ public ThymeleafViewResolver viewResolver() {
+ ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
+ viewResolver.setTemplateEngine(templateEngine());
+ viewResolver.setOrder(1);
+ return viewResolver;
+ }
+
+ @Bean
+ @Description("Spring Message Resolver")
+ public ResourceBundleMessageSource messageSource() {
+ ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+ messageSource.setBasename("messages");
+ return messageSource;
+ }
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");
+ }
+
+ @Override
+ @Description("Custom Conversion Service")
+ public void addFormatters(FormatterRegistry registry) {
+ registry.addFormatter(new NameFormatter());
+ }
+}
diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/appServlet/servlet-context.xml b/spring-thymeleaf/src/main/webapp/WEB-INF/appServlet/servlet-context.xml
deleted file mode 100644
index ef42557429..0000000000
--- a/spring-thymeleaf/src/main/webapp/WEB-INF/appServlet/servlet-context.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/root-context.xml b/spring-thymeleaf/src/main/webapp/WEB-INF/root-context.xml
deleted file mode 100644
index 5cb2a94d73..0000000000
--- a/spring-thymeleaf/src/main/webapp/WEB-INF/root-context.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/web.xml b/spring-thymeleaf/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 275a482c6f..0000000000
--- a/spring-thymeleaf/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
- contextConfigLocation
- /WEB-INF/root-context.xml
-
-
-
-
- org.springframework.web.context.ContextLoaderListener
-
-
-
-
- appServlet
- org.springframework.web.servlet.DispatcherServlet
-
- contextConfigLocation
- /WEB-INF/appServlet/servlet-context.xml
-
- 1
-
-
-
- appServlet
- /
-
-
\ No newline at end of file