在 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 但可以独立运行的主要内容,如果未能解决你的问题,请参考以下文章