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

43,580

Solution 1

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

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

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

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

Share:
43,580
Duncan Jones
Author by

Duncan Jones

Updated on July 13, 2022

Comments

  • Duncan Jones
    Duncan Jones almost 2 years

    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>
    
  • mayank
    mayank almost 5 years
    Thanks a lot but now the class is depricated ;)
  • noman404
    noman404 over 2 years
    Very important information, was struggling for a while, thanks Dipu!
  • PKS
    PKS over 2 years
    mayank, can you tell the latest way?
  • Tone
    Tone about 2 years
    I'm using Tomcat 9 and still facing this issue.