在 Tomcat 中部署的 Spring Boot 提供 404 但可以独立运行

Posted

技术标签:

【中文标题】在 Tomcat 中部署的 Spring Boot 提供 404 但可以独立运行【英文标题】:Spring Boot Deployed in Tomcat gives 404 but works Stand-alone 【发布时间】:2015-03-21 06:22:46 【问题描述】:

我已经用嵌入式 Tomcat 测试 Spring Boot 大约一个月了,以构建一个 REST API。一切正常。我们现在想要将 API 部署在一个单独的开发环境中,该环境有几个其他(非 Spring)应用程序在 Tomcat 容器上运行。

我进行了Converting a Spring Boot JAR Application to a WAR using Maven 和Spring Boot Docs 中指定的更改。

部署进展顺利(日志很好,没有错误),查看 Tomcat 管理我看到我的应用程序已部署。但是,当我尝试在 curl 中访问 http://localhost:8080/sophia/users 时,我得到 404。

非常感谢任何帮助。

更新:

这是我的日志:

Netbeans:

NetBeans:在 Apache Tomcat 8.0.17 上部署 个人资料模式:假 调试模式:假 强制重新部署:true

在 /home/bugz/workspace/pdcore/sophiaserver/target/sophia-server-1.0.0-SNAPSHOT 的就地部署

部署正在进行中...

deploy?config=file%3A%2Ftmp%2Fcontext1845402702541504208.xml&path=/sophia

OK - 在上下文路径 /sophia 部署应用程序

启动正在进行中...

start?path=/sophia

OK - 在上下文路径 /sophia 启动应用程序

雄猫:

INFO 10:47:52:703 org.springframework.boot.context.embedded.ServletRegistrationBean - 将 servlet:'dispatcherServlet' 映射到 [/sophia/*]

INFO 10:47:54:042 org.springframework.boot.SpringApplication - 在 8.285 秒内启动应用程序(JVM 运行 12087.301)

22-Jan-2015 10:47:54.060 INFO [http-nio-8080-exec-99] org.apache.catalina.startup.HostConfig.deployDescriptor 部署配置描述符 /home/bugz/workspace/server/apache -tomcat-8.0.17/conf/Catalina/localhost/sophia.xml 已在 12,091 毫秒内完成

在 Catalina localhost 的 sophia.xml 中:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" docBase="/home/bugz/workspace/pdcore/sophiaserver/target/sophia-server-1.0.0-SNAPSHOT" path="/sophia"/>

我已尝试访问

    http://localhost:8080/sophia/users http://localhost:8080/sophia-server-1.0.0-SNAPSHOT/users(WAR 名称)

第一个返回 404,但带有来自我的 CORS 过滤器 bean 的 CORS 信息。第二个返回 404 没有 CORS 信息(这表明应用程序已启动并已配置,但我似乎无权访问控制器)。

【问题讨论】:

检查您的日志文件,您确定应用程序部署在该特定 URL... @M. Deinum,我已经添加了我得到的日志。控制器已映射,它似乎正在按预期部署上下文 (/sophia)。 你的应用被映射到/sophia,接下来你的DispatcherServlet被映射到/sophia/*,使得URL调用/sophia/sophia/users。当作为 jar 运行时,它被部署为映射到 / 的根应用程序... 真棒@M。 Deinum,请添加一个答案,我会接受。非常感谢! 【参考方案1】:

在运行应用程序时,调用路径由几个部分组成。

第一个是部署应用程序的基本 URL,在您的情况下是 /sophia

第二个是 DispatcherServlet 的 servlet 映射,在您的情况下是 /sohpia/*

第三个是DispatcherServlet里面的控制器的映射,在你的例子中就是/users

所有这些组合在一起创建了 URL /sophia/sophia/users

部署为 WAR 之间的区别在于您包含一个单独的 URL 来部署,当它作为 jar 运行时,默认情况下部署到 /(根)。

您可以通过将/sophia 作为server.context-path 放入application.properties 并将DispatcherServlet 映射到/*/ 来修复它。这将在这两种情况下为您提供您想要(和预期)的 URL。

【讨论】:

当您使用嵌入式服务器进行部署时,它会在没有应用名称段的情况下运行。这个细节是我的问题。【参考方案2】:

检查 java -version 表示如果您在 java 8 中编译了 war 并且 tomcat 在 java 7 上运行,则它不起作用。

【讨论】:

【参考方案3】:

您是否尝试过扩展 SpringBootServletInitializer 并覆盖 configure 方法?如上所述here

与将您的应用程序作为容器内的war文件运行相比,jar文件的入口点是不同的[主类]。

希望这会有所帮助。

【讨论】:

【参考方案4】:

检查java版本

pom.xml 中存在的版本必须与服务器上安装的版本相同

openjdk 11 对我来说很好用

https://adoptopenjdk.net/

【讨论】:

以上是关于在 Tomcat 中部署的 Spring Boot 提供 404 但可以独立运行的主要内容,如果未能解决你的问题,请参考以下文章

把spring-boot项目部署到tomcat容器中

在 Tomcat 中部署的 Spring Boot 提供 404 但可以独立运行

spring boot tomcat 部署

部署在tomcat上的Spring Boot无法启动

spring boot --部署war到tomcat中

Spring Boot Tomcat部署不起作用Tomcat 7