I have the following Spring MVC code:
config files:
public class MainWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(final ServletContext sc) throws ServletException { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(WebConfig.class); root.setServletContext(sc); root.scan("testspring"); sc.addListener(new ContextLoaderListener(root)); ServletRegistration.Dynamic appServlet = sc.addServlet("dispatcher", new DispatcherServlet(new GenericWebApplicationContext())); appServlet.setLoadOnStartup(1); appServlet.addMapping("/"); } }
@EnableWebMvc @Configuration @ComponentScan("testspring") public class WebConfig extends WebMvcConfigurerAdapter { /* @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); }*/ @Bean public ViewResolver viewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".html"); return bean; } }
contollers:
@Controller public class HomeController { @RequestMapping(value = "/") public String home() { System.out.println("HHomeController: Passing through..."); return "home.html"; } }
@RestController public class TestRestController { @RequestMapping(value = "/api") public String home() { System.out.println("Rest: Passing through..."); return "some json"; } }
I get the following errors when I deploy:
Accessing the /api
page, however, works just fine.
EDIT:
After replacing home.html
with home
, the error is still present – both in IDE and the 404 in browser:
Also maybe it’s relevant – I get this pop up at one of the config classes:
Advertisement
Answer
The problem was me using JstlView.class
and ViewResolver
with .html
pages that I wanted to render via thymeleaf
. If I change the code inside WebConfig
to:
@Bean public ViewResolver viewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".jsp"); return bean; }
and replace home.html
with home.jsp
it works just fine.
Not sure how I’d need to do with thymeleaf
. I decided to go with rest controllers instead, but maybe someone would be able to post thymeleaf
-friendly version of the code later. I was recommended this: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html for writting a correct method. Might come back to this answer to edit later.