4

I have an existing Spring Boot application which uses JSP for views. I would like to move the view technology over to Thymeleaf, progressively.

The JSP view resolver is set up in application.properties:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

The JSPs are located in:

src/main/resources/META-INF/resources/WEB-INF/views/

Is it possible to add a second view-resolver for Thymeleaf, for views which do not exist as JSP? So that the application tries both view-resolvers when a view is requested.

Edit

I have also tried with the following configuration, without success:

@Bean
public InternalResourceViewResolver jspViewResolver() {
    final InternalResourceViewResolver vr = new InternalResourceViewResolver();
    vr.setPrefix("/META-INF/resources/WEB-INF/views/");
    vr.setSuffix(".jsp");
    vr.setViewClass(JstlView.class);
    vr.setOrder(1);
    return vr;
}

@Bean
public TemplateResolver templateResolver() {
    final ServletContextTemplateResolver tr = new ServletContextTemplateResolver();
    tr.setPrefix("templates/th/");
    tr.setSuffix(".html");
    tr.setTemplateMode("HTML5");
    return tr;
}

@Bean
public SpringTemplateEngine templateEngine() {
    final SpringTemplateEngine te = new SpringTemplateEngine();
    // te.addTemplateResolver(jspViewResolver());
    te.setTemplateResolver(templateResolver());
    te.setMessageSource(databaseMessageSource);
    return te;
}

@Bean
public ViewResolver viewResolver() {
    final ThymeleafViewResolver vr = new ThymeleafViewResolver();
    vr.setTemplateEngine(templateEngine());
    vr.setOrder(2);
    return vr;
}

1 Answer 1

0

You might try out to configure it through Java Config.

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;

@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter{

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.viewResolver(new ThymeleafViewResolver());

        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setViewClass(JstlView.class);
        internalResourceViewResolver.setPrefix("/WEB-INF/views");
        internalResourceViewResolver.setSuffix(".jsp");
        registry.viewResolver(internalResourceViewResolver);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Keep in mind that InternalResourceViewResolver should come last.

Also another useful answers on SO

  1. How to use multiple ViewResolvers in Spring?
  2. Spring MVC with multiple view resolvers
2
  • This leads to "org.thymeleaf.exceptions.TemplateInputException: Error resolving template "home", template might not exist or might not be accessible by any of the configured Template Resolvers", like if it does not try the second option which is the jsp view-respover, which would be able to resolve "home". I tried setting the order of the view resolvers as well in your example, without any effect.
    – yglodt
    Commented Dec 26, 2016 at 9:34
  • @yglodt Do you configure prefixes and suffixes for your particular case on both resolvers ?
    – marknorkin
    Commented Dec 26, 2016 at 13:37

Not the answer you're looking for? Browse other questions tagged or ask your own question.