Jboss7 : Undertow Spring Boot throwing 404
Asked Answered
B

1

0

I'm developing a Spring boot application.

I'm building a war file for JBoss

My war is building correctly , I'm using *-war.original as deployment for JBoss the deployment seems fine

But when I make call to controller, it's throwing a 404 With embedded sever it's working fine

pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
<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.my.service</groupId>
    <artifactId>my-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencyManagement>
        <dependencies>
            <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Swagger UI Depedency -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!-- Oracle JDBC driver -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0</version>
        </dependency>
        </dependencies>
    </dependencyManagement>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
        <scope>provided</scope>
    </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- <version>2.0.1.RELEASE</version> -->
                <!-- https://mcmap.net/q/388674/-why-spring-boot-generates-jar-or-war-file-with-original-extension  -->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- https://mcmap.net/q/1924318/-only-generate-one-war-during-package -->
                    </execution>
                </executions>
            </plugin>
            <!-- This configuration helps to generate war file without web.xml, spring 
                boot projects -->
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

SpringBootServletInitializer

@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer{

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyApiApplication.class);
     }

@Override
public void onStartup(ServletContext servletContext) throws ServletException{
    super.onStartup(servletContext);

     }
}

Deployment log

12:01:09,605 INFO  [stdout] (ServerService Thread Pool -- 162)  ::
Spring Boot ::        (v2.0.1.RELEASE)
    2018-04-24 12:01:09,605 [ServerService Thread Pool -- 162] INFO  (AbstractLoggingWriter.java:71) -  :: Spring Boot ::       
(v2.0.1.RELEASE)
    12:01:09,605 INFO  [stdout] (ServerService Thread Pool -- 162)
    2018-04-24 12:01:09,605 [ServerService Thread Pool -- 162] INFO  (AbstractLoggingWriter.java:71) -
    12:01:09,669 INFO  [com.aerlingus.dei.subscriber.api.ServletInitializer] (ServerService
Thread Pool -- 162) Starting ServletInitializer on USER with PID 10692
(started by ADMIN in C:\pathto\jboss-eap-7.1\bin)
    2018-04-24 12:01:09,669 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - Starting ServletInitializer on CND7064JRN with
PID 10692 (started by ADMIN in C:\pathto\jboss-eap-7.1\bin)
    2018-04-24 12:01:09,669 [ServerService Thread Pool -- 162] DEBUG (JBossLog.java:134) - Running with Spring Boot v2.0.1.RELEASE, Spring
v5.0.5.RELEASE
    12:01:09,670 INFO  [com.aerlingus.dei.subscriber.api.ServletInitializer] (ServerService
Thread Pool -- 162) The following profiles are active: uat
    2018-04-24 12:01:09,670 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - The following profiles are active: uat
    12:01:09,686 INFO  [org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext]
(ServerService Thread Pool -- 162) Refreshing
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5023cb50:
startup date [Tue Apr 24 12:01:09 BST 2018]; root of context hierarchy
    2018-04-24 12:01:09,686 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - Refreshing
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5023cb50:
startup date [Tue Apr 24 12:01:09 BST 2018]; root of context hierarchy
    12:01:09,805 INFO  [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]
(ServerService Thread Pool -- 162) JSR-330 'javax.inject.Inject'
annotation found and supported for autowiring
    2018-04-24 12:01:09,805 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - JSR-330 'javax.inject.Inject' annotation found
and supported for autowiring
    12:01:09,816 INFO  [io.undertow.servlet] (ServerService Thread Pool -- 162) Initializing Spring embedded WebApplicationContext
    2018-04-24 12:01:09,816 [ServerService Thread Pool -- 162] INFO  (ServletContextImpl.java:360) - Initializing Spring embedded
WebApplicationContext
    12:01:09,816 INFO  [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 162) Root WebApplicationContext:
initialization completed in 130 ms
    2018-04-24 12:01:09,816 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - Root WebApplicationContext: initialization
completed in 130 ms
    12:01:09,987 INFO  [org.springframework.boot.web.servlet.FilterRegistrationBean]
(ServerService Thread Pool -- 162) Mapping filter: 'errorPageFilter'
to: [/*]
    2018-04-24 12:01:09,987 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - Mapping filter: 'errorPageFilter' to: [/*]
    12:01:10,015 INFO  [com.aerlingus.dei.subscriber.api.ServletInitializer] (ServerService
Thread Pool -- 162) Started ServletInitializer in 0.683 seconds (JVM
running for 4712.635)
    2018-04-24 12:01:10,015 [ServerService Thread Pool -- 162] INFO  (JBossLog.java:134) - Started ServletInitializer in 0.683 seconds (JVM
running for 4712.635)
    12:01:10,021 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (ServerService
Thread Pool -- 162) Initializing Mojarra 2.2.13.SP3  for context
'/my-api'
    2018-04-24 12:01:10,021 [ServerService Thread Pool -- 162] INFO  (ConfigureListener.java:213) - Initializing Mojarra 2.2.13.SP3  for
context '/my-api'
    12:01:11,566 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 162) WFLYUT0021: Registered web context: '/my-api' for
server 'default-server'
    2018-04-24 12:01:11,566 [ServerService Thread Pool -- 162] INFO  (Host.java:220) - WFLYUT0021: Registered web context: '/my-api' for
server 'default-server'
    12:01:11,583 INFO  [org.jboss.as.server] (External Management Request Threads -- 3) WFLYSRV0010: Deployed "my-api.war" (runtime-name
: "my-api.war")
    2018-04-24 12:01:11,583 [External Management Request Threads -- 3] INFO  (DeploymentHandlerUtil.java:171) - WFLYSRV0010: Deployed
"my-api.war" (runtime-name : "my-api.war")

WEB-INF/jboss-web.xml

<jboss-web>
    <context-root>my-api</context-root>
</jboss-web>

similar to this Getting "404 - Not found" error with Wildfly and springboot

Beira answered 24/4, 2018 at 11:29 Comment(5)
Hello, what is the purpose of having WEB-INF/jboss-web.xml, please?Weaks
I used it for setting the context root, because when i tried with spring boot properties file for context root it didn't work. Jboss always consider the deployment name as context root in my case my context root should be different from the deployment name, that's why i use jboss-web.xml.Beira
If I understand it right, if you set context-root to be my-api, you will be able to access it via localhost:8080/my-api, is it correct? What will happen if you do not set the context-root via WEB-INF/jboss-web.xml?Weaks
when i tried my-api in application.yaml or properties it was not working when i deployed war file to jboss, because when CI build war file the name of file will be my-api-version.war. so when i hit localhost:8080/my-api i got a 404 , but when hit localhost:8080/my-api-version/ it starts working . So i think jboss route request based on deployment name, you can override it with jboss-web.xml. may be there is a better way for this . please try it yourself. Also I used deployment-structure.xml to exclude logging to disable jboss logging and fall back to spring boot logging.Beira
@CongBangDO here is an example for why i used jboss-web.xml https://mcmap.net/q/1799458/-getting-quot-404-not-found-quot-error-with-wildfly-and-springbootBeira
B
1

Finally figured out what was wrong in I did, I have an Application class with main method without @SpringBootApplication along with SpringBootServletInitializer , So Jboss was not picking up the mapping correctly

The resolution was to make SpringBootServletInitializer class with main method. So I change ServletInitializermentioned in question

@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer{

public static void main(String[] args) {
        SpringApplication.run(ServletInitializer.class, args);
    }

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(ServletInitializer.class);
     }

@Override
public void onStartup(ServletContext servletContext) throws ServletException{
    super.onStartup(servletContext);

     }
}

After that I was able to hit endpoint,

Why I didn't do this earlier ??

I generated the project using SPRING INITIALIZR with war packaging, When SPRING INITIALIZR generate project Application and SpringBootServletInitializer classes was there. Among both classes Appliaction class has the main method and @SpringBootApplication annotation

While writing Integration test initially it was not working , Then I change @SpringBootApplication annotation to SpringBootServletInitializer and write a main method in SpringBootServletInitializer test start working. But I kept the main method back in Appliaction class that was the root cause of this issue.

Since Spring Initializer, generate the classes I was in assumption , all classes generated are required to build war .So I kept the Application class the way it's generated without @SpringBootApplication annotation while generating war file. I think Jboss got confused which main method it should run. And eventually throwing a 404 exception while hitting end point

Beira answered 26/4, 2018 at 8:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.