java - La aplicación Spring Boot proporciona 404 cuando se implementa en Tomcat pero funciona con un servidor incorporado
maven spring-mvc (1)
Guiado por Servir contenido web con Spring MVC , estoy creando una aplicación web Spring Boot que puedo ejecutar tanto con la instancia integrada de Tomcat como en un servidor Tomcat 8 independiente.
La aplicación funciona como se esperaba cuando se ejecuta como java -jar adminpage.war
y veo el resultado esperado cuando visito http://localhost:8080/table
. Sin embargo, cuando implemento en un servidor Tomcat 8 (al colocar adminpage.war
en el directorio webapps
), adminpage.war
un error 404 cuando visito https://myserver/adminpage/table
.
Los archivos catelina.log
y localhost.log
no contienen nada útil en el servidor Tomcat.
¿Alguien puede sugerir dónde he hecho una mala configuración? No he tenido los mismos problemas en el pasado al implementar servicios RESTful con Spring Boot, pero esta es mi primera incursión en una aplicación web.
Mis archivos de aplicación:
src/main/java/com/.../Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
src/main/java/com/.../MainController.java
@Controller
public class MainController {
@RequestMapping("/table")
public String greeting(Model model) {
model.addAttribute("name", "Fooballs");
return "table";
}
}
src/main/resources/templates/table.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="''Hello, '' + ${name} + ''!''" />
</body>
</html>
pom.xml
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>adminpage</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>adminpage</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Me había olvidado de modificar mi archivo Application.java
para extender SpringBootServletInitializer
y anular el método de configure
.
Archivo corregido:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
Sugerencia de sombrero a https://mtdevuk.com/2015/07/16/how-to-make-a-spring-boot-jar-into-a-war-to-deploy-on-tomcat/ por señalar mi error .
Más información en Crear un archivo de guerra desplegable en los documentos oficiales de Spring Boot.