繁体   English   中英

部署在外部tomcat 9服务器上时,Spring Boot REST Controller返回404

[英]Spring Boot REST Controller returns 404 when deployed on external tomcat 9 server

我有一个spring boot rest web应用程序,它可以在嵌入式服务器上完美运行。 但是,按照博客https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file中提到的步骤后,我收到了404错误消息我发送resquest给服务器上的资源。我在本地使用了java 1.8.0_212并使用了java 1.8.0_131并在服务器上的tomcat 9上部署了我的应用程序。 令我困惑的一件事是可以访问扩展CrudRepository的存储库。 以下是我的申请入门点。

@SpringBootApplication
@ComponentScan(basePackages = "com.dbe.ref")
public class RefmsApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(RefmsApplication.class);
    }

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

还有我的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.dbe.ref</groupId>
    <artifactId>refms</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>refms</name>
    <description>project for Rural electrification fund</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>LATEST</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <start-class>com.RefmsApplication</start-class>
    </properties>

    <dependencies>

        <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-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <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>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>angularjs</artifactId>
            <version>1.4.10</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.4</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>font-awesome</artifactId>
            <version>4.7.0</version>
        </dependency>
        <dependency>
            <groupId>eu.michael-simons</groupId>
            <artifactId>wro4j-spring-boot-starter</artifactId>
            <version>0.3.4</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.dynamicreports</groupId>
            <artifactId>dynamicreports-core</artifactId>
            <version>5.0.0</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>refms</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

这是日志的一部分:

2017-09-19 10:38:20.564  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'errorPageFilter' to: [/*]
2017-09-19 10:38:20.565  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-09-19 10:38:20.566  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-09-19 10:38:20.568  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-09-19 10:38:20.568  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-09-19 10:38:20.571  INFO 6660 --- [           main] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
2017-09-19 10:38:20.571  INFO 6660 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'configurableWroFilter' to urls: [/wro4j/*]
2017-09-19 10:38:20.572  INFO 6660 --- [           main] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServletRegistration' to [/refms/*]
2017-09-19 10:38:20.573  INFO 6660 --- [           main] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]

默认情况下,在嵌入式服务器和外部服务器上部署应用程序时会有一些差异。

使用嵌入式服务器,您可以使用以下方法访问您

http://localhost:<port>/<resourceName>

如果您在另一个容器中部署war ,则需要使用以下版本添加应用程序名称:

http://localhost:<port>/<applicationNameWithVersion>/<resourceName>

例如,如果部署此示例,则嵌入式服务器的URL为:

http://localhost:8080/greeting

和外部部署的应用程序的URL,如下所示:

http://localhost:8999/gs-rest-service-0.1.0/greeting

注意:此URL属于我的应用程序服务器,因此可能会对您的URL进行一些更改。

如果您需要帮助,请评论。

检查是否

<build>
     <finalName>refms</finalName>
         ...
</build>

在pom.xml中对应的

server.contextPath=/refms

在application.properties中并检查

<Context path="/refms"/>

在context.xml中。 也许在部署后tomcat中的根上下文不同。

另外,改变这种依赖性

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency>

这样

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

对于外部tomcat

检查src/main/java的根包,它应该与POM groupid中提到的包名相同,即。 com.dbe.ref如果存在任何不匹配,则发生相同的问题。

确保已为spring Boot应用程序添加了上下文路径。 通常它位于src \\ main \\ resources中的application.properties文件中。 在该属性文件中,添加属性:

server.contextPath=/refms

您应该能够使用以下方式链接localhost:8080/refms/api/account/authenticate访问您的应用程序localhost:8080/refms/api/account/authenticatelocalhost:8080/refms-xxxx/api/account/authenticate (其中xxxx是您的工件版本)

在您的评论中,您提到/ authenticate正在给出404,这是因为您已将登录进程URL设置为“authenticate”。 这是登录表单发布到的URL。 如果未指定,则默认为/ login。 Spring Security框架拦截该URL并获取登录名和密码参数。

将应用程序部署到Tomcat时,URL取决于部署应用程序的上下文路径。 大多数情况下,这与您放入Tomcat'webapps'目录的war文件的名称完全匹配。 您可以通过查看“webapps”目录来查看名称。 你的war文件现在可能也被扩展到了一个目录中。

由于您已将finalName放入maven构建部分,因此您的war文件应命名为: refms.war ,因此您的应用程序将在以下位置运行:

HTTP://主机:端口/ refms /

我的假设是你在将war文件复制到tomcat之前没有将war文件重命名为ROOT.war,因此你的应用程序将不会运行:

HTTP://主机:端口/

如果您这样做,您的应用程序将运行类似于嵌入式Tomcat实例; 在根上下文。

从您的日志文件中我可以看到您的身份验证端点映射到/ refms /

Mapping servlet: 'dispatcherServletRegistration' to [/refms/*]

这与应用程序的上下文根相关。 因此,如果您没有重命名war文件,您收到404的身份验证端点可能会位于:

http://localhost:8080/refms/refms/api/account/authenticate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM