'Spring Boot application gives 404 when deployed to Tomcat but works with embedded server

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>


Solution 1:[1]

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 2:[2]

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 3:[3]

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 4:[4]

Just add the route in the controller annotation, something like this: @RestController @RequestMapping(value = "/")

Solution 5:[5]

For me, the Spring boot wasn't work with tomcat 10. I changed for 9 version and it worked.

Solution 6:[6]

Quoting dieter's answer on another SO question:

You war file name is priz-0.5.war. So the context name is also priz-0.5. You have to call for example http://localhost:8080/priz-0.5

If you want to call it like http://localhost:8080/ just rename the war-File to ROOT.war

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dipu Krishnan
Solution 2 Hanumant
Solution 3 Achintya Shivam
Solution 4 Diego Mejia
Solution 5 CesarJunior
Solution 6 mowwwalker