Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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> 
like image 632
Duncan Jones Avatar asked Sep 19 '16 07:09

Duncan Jones


People also ask

How do I fix error 404 in Tomcat?

This error indicates that the server could not find the desired resource. This resource can be any file such as JSP, HTML, or image resource. Usually, the resource is present, but it is referenced incorrectly. In most cases, you can fix this by correcting the URL.

Can we configure embedded Tomcat server in spring boot?

We can start Spring boot applications in an embedded tomcat container that comes with some pre-configured default behavior via a properties file. In this post, we will learn to modify the default tomcat configurations via overriding respective properties in application.

Can we deploy spring boot application in Tomcat?

By using Spring Boot application, we can create a war file to deploy into the web server. In this chapter, you are going to learn how to create a WAR file and deploy the Spring Boot application in Tomcat web server.


1 Answers

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.

like image 134
Duncan Jones Avatar answered Sep 20 '22 21:09

Duncan Jones