本文介绍了Jboss7:Undertow Spring Boot投掷404的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个Spring Boot应用程序.

I'm developing a Spring boot application.

我正在为JBoss构建战争文件

I'm building a war file for JBoss

我的战争正在正确建立,我正在使用* -war.original作为JBoss的部署部署似乎很好

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

但是当我打电话给控制器时,它抛出了404使用嵌入式服务器可以正常工作

But when I make call to controller, it's throwing a 404With 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://stackoverflow.com/questions/43641664/why-spring-boot-generate-jar-or-war-file-with-original-extention  -->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- https://stackoverflow.com/questions/30325549/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

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);

     }
}

部署日志

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

WEB-INF/jboss-web.xml

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

与此类似获取"404-未找到" Wildfly和springboot出现错误

推荐答案

最后弄清楚我做错了什么,我有一个Application类,它的主方法没有@SpringBootApplicationSpringBootServletInitializer,所以Jboss没有选择正确设置映射

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

解决方案是使用main方法创建SpringBootServletInitializer类.因此,我更改了问题中提到的ServletInitializer

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,

为什么我以前没有这样做?

我使用生成了项目使用战争打包的SPRING INITIALIZR ,当 SPRING INITIALIZR 生成项目ApplicationSpringBootServletInitializer班级在那里.在这两个类中,Appliaction类具有main方法和@SpringBootApplication注释

I generated the project usingSPRING 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

在最初编写集成测试时,它不起作用,然后将@SpringBootApplication批注更改为SpringBootServletInitializer,并在SpringBootServletInitializer测试中编写了一个主要方法,开始工作.但是我将主要方法保留在Appliaction类中,这是此问题的根本原因.

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.

自从Spring Initializer生成了我假设的类之后,生成的所有类都是构建war所必需的.因此,在生成war文件时,我将Application类的生成方式保留为没有@SpringBootApplication批注的方式.我认为Jboss对应该运行哪种主要方法感到困惑.最终在到达终点时抛出404异常

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

这篇关于Jboss7:Undertow Spring Boot投掷404的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 04:22