Spring Boot deja de resolver vistas después de unos minutos.

Tengo una aplicación Spring Boot que, de repente, deja de resolver las vistas y en su lugar me lanza 404 errores.

Estas son mis dependencias:

 org.springframework.boot spring-boot-starter   org.springframework.boot spring-boot-starter-test test   org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-data-jpa   org.springframework spring-context    org.apache.tomcat.embed tomcat-embed-jasper provided    org.hibernate hibernate-validator    com.jolbox bonecp ${bonecp.version}    com.oracle ojdbc14 10.2.0.4.0 system ${basedir}/src/main/resources/lib/ojdbc14-10.2.0.4.0.jar   com.google.guava guava ${guava.version}   javax.inject javax.inject 1   javax.servlet jstl   com.fasterxml.jackson.datatype jackson-datatype-hibernate4 2.5.3   org.springframework.boot spring-boot-starter-web  

La aplicación comienza bien, y me permite navegar sin ningún problema. Sin embargo, si dejo de verlo y simplemente sigo haciendo cosas, cuando actualizo el navegador web veo una página de Tomcat 404:

 HTTP Status 404 - /WEB-INF/jsp/home.jsp type: Status report message: /WEB-INF/jsp/home.jsp description: The requested resource is not available. Apache Tomcat/7.0.52 

Controlador doméstico (aunque todos los controladores que devuelven una vista fallan):

 @Controller public class ProjectOutputController { private static final Logger LOGGER = LoggerFactory.getLogger(ProjectOutputController.class); private final ProjectOutputService projectOutputService; @Value("${app.version}") private String appVersion; @Inject public ProjectOutputController(final ProjectOutputService projectOutputService) { this.projectOutputService = projectOutputService; } @RequestMapping(value={"/", "/home", "/results"}) public ModelAndView getHomeView(){ LOGGER.trace("Returning main view"); ModelMap map = new ModelMap(); List projectOutputs = projectOutputService.getProjects(); map.addAttribute("projects", projectOutputs); map.addAttribute("appVersion", appVersion); return new ModelAndView("home",map); } 

Este funciona, sin embargo, ya que no devuelve una vista sino un JSON sin formato como cadena

 @RequestMapping(method=RequestMethod.GET, value={"/overview/{projectId}"}, produces = "application/json") @ResponseBody public ResponseEntity showProjectJson(@PathVariable String projectId) { LOGGER.trace("Returning JSON for project ID " + projectId + " view"); try { return new ResponseEntity (projectOverviewService.getProjectbyId(projectId), HttpStatus.OK); } catch (ProjectOverviewNotFoundException e) { LOGGER.error("Project not found - " + e); return new ResponseEntity (HttpStatus.NOT_FOUND); } } } 

El registro de rastreo de Spring Boot:

 2016-03-18 12:49:26 TRACE oswsvInternalResourceViewResolver:164 - Cached view [home] 2016-03-18 12:49:26 DEBUG oswsvContentNegotiatingViewResolver:402 - Returning [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsp/home.jsp]] based on requested media type 'text/html' 2016-03-18 12:49:26 DEBUG oswsDispatcherServlet:1214 - Rendering view [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsp/home.jsp]] in DispatcherServlet with name 'dispatcherServlet' 2016-03-18 12:49:26 TRACE oswsvJstlView:261 - Rendering view with name 'home' with model {projects=[ (...) ], appVersion=1.1} and static attributes {} 2016-03-18 12:49:26 DEBUG oswsvJstlView:377 - Added model object 'projects' of type [java.util.ArrayList] to request in view with name 'home' 2016-03-18 12:49:26 DEBUG oswsvJstlView:377 - Added model object 'appVersion' of type [java.lang.String] to request in view with name 'home' 2016-03-18 12:49:26 DEBUG oswsvJstlView:207 - Forwarding to resource [/WEB-INF/jsp/home.jsp] in InternalResourceView 'home' 2016-03-18 12:49:26 TRACE ostsTransactionSynchronizationManager:243 - Removed value [org.springframework.orm.jpa.EntityManagerHolder@1b217c9] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@17b412f] from thread [http-nio-8080-exec-1] 2016-03-18 12:49:26 DEBUG osojsOpenEntityManagerInViewInterceptor:112 - Closing JPA EntityManager in OpenEntityManagerInViewInterceptor 2016-03-18 12:49:26 DEBUG osojEntityManagerFactoryUtils:435 - Closing JPA EntityManager 2016-03-18 12:49:26 TRACE ohiSessionImpl:353 - Closing session 2016-03-18 12:49:26 TRACE ohejiJdbcCoordinatorImpl:190 - Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@d45342] 2016-03-18 12:49:26 TRACE ohejiLogicalConnectionImpl:178 - Closing logical connection 2016-03-18 12:49:26 DEBUG ohejiLogicalConnectionImpl:246 - Releasing JDBC connection 2016-03-18 12:49:26 DEBUG ohejiLogicalConnectionImpl:264 - Released JDBC connection 2016-03-18 12:49:26 TRACE ohejiLogicalConnectionImpl:190 - Logical connection closed 2016-03-18 12:49:26 TRACE oswsDispatcherServlet:1053 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@1b8ac37 2016-03-18 12:49:26 DEBUG oswsDispatcherServlet:991 - Successfully completed request 2016-03-18 12:49:26 TRACE osbceAnnotationConfigEmbeddedWebApplicationContext:331 - Publishing event in org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@121bfd2: ServletRequestHandledEvent: url=[/]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcherServlet]; session=[null]; user=[null]; time=[390ms]; status=[OK] 

Al controlador se le llama bien, y cumple su función (como recuperar registros de la base de datos para rellenar el ModelMap (variables appVersion y projects , que he redactado a “(…)”) antes de devolverlo) mirando en el registro

La página que estoy intentando cargar funciona bien cuando la aplicación acaba de iniciarse, por lo que el controlador funciona (siempre ha funcionado bien, pero debo haber introducido un cambio que causó todo esto). Al detener y reiniciar la aplicación en el Tomcat incorporado, se soluciona el problema y, al implementar un WAR en un servidor de Linux Tomcat independiente, la aplicación parece funcionar bien (media hora y no 404).

No creo que haya suficiente información sobre la pregunta original, pero como estaba enfrentando este mismo problema, esta fue la solución para mí:

 @Bean public ITemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setPrefix("classpath:/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); templateResolver.setCacheable(true); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.addDialect(new LayoutDialect()); templateEngine.addDialect(new SpringSecurityDialect()); templateEngine.setTemplateResolver(templateResolver()); return templateEngine; } @Bean public ViewResolver viewResolver() { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine()); viewResolver.setOrder(0); // viewResolver.setViewNames(new String[] { "*.html", "*.xhtml" }); return viewResolver; } 

Eliminando viewResolver.setViewNames(new String[] { "*.html", "*.xhtml" }); arreglado el problema.

Una vez que configuré el nivel de registro para rastrear, pude ver el problema: Resource "classpath:/templates/home.html.html was not found" Se agregaron dos sufijos a las plantillas. En cuanto a por qué funcionó durante unos minutos antes de fallar, todavía es un misterio para mí.

Espero que esto ayude a alguien.