Spring Boot application gives 404 when deployed to Tomcat but works with embedded server
JavaMavenSpring MvcTomcatSpring BootJava Problem Overview
Guided by Serving Web Content with Spring MVC, I'm creating a Spring Boot web application that I can run using both the embedded Tomcat instance as well as on a standalone Tomcat 8 server.
The application works as expected when executed as java -jar adminpage.war
and I see the expected outcome when I visit http://localhost:8080/table
. However, when I deploy to a Tomcat 8 server (by dropping adminpage.war
into the webapps
directory), I get a 404 error when I visit https://myserver/adminpage/table
.
The catelina.log
and localhost.log
files contain nothing helpful on the Tomcat server.
Can anyone suggest where I've made a misconfiguration? I've not had the same problems in the past when deploying RESTful services with Spring Boot, but this is my first foray into a web application.
My application files:
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>
Java Solutions
Solution 1 - Java
I had forgotten to tweak my Application.java
file to extend SpringBootServletInitializer
and override the configure
method.
Corrected file:
@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);
}
}
Hat tip to https://mtdevuk.com/2015/07/16/how-to-make-a-spring-boot-jar-into-a-war-to-deploy-on-tomcat/ for pointing out my mistake.
More info at Create a deployable war file in Spring Boot Official docs.
Solution 2 - Java
As of August 2021 . If anyone facing this issue in Tomcat 10 server, just read in the below post that Spring boot won't work in Tomcat 10. https://github.com/spring-projects/spring-boot/issues/22414
I had faced this issue and switching to an previous version, which resolved the problem.
Solution 3 - Java
In case anyone having same problem while using sprint boot in the IntelliJ community edition. You just need to put your main class in the main package (com.xyx) don't put it in any subpackage which is created inside com.xyx.
Solution 4 - Java
Downgrading Tomcat from version 10 to 9 did the trick for me. Update January 2022, apparently tomcat 10 still does not support spring-boot. As mentioned by Dipu over here, https://stackoverflow.com/a/68917349/13294956
Solution 5 - Java
Just add the route in the controller annotation, something like this:
@RestController
@RequestMapping(value = "/
Solution 6 - Java
For me, the Spring boot wasn't work with tomcat 10. I changed for 9 version and it worked.