Spring 启动 MVC 应用程序 returns 部署到外部 Tomcat/tc 服务器实例时出现 HTTP 404
Spring Boot MVC Application returns HTTP 404 when deployed to an external Tomcat/tc Server instance
我正在使用 Spring Boot plus Spring web starter 开发一个简单的应用程序。当我使用嵌入式 Tomcat 服务器(JAR 包装)进行测试时,它运行得非常好。我需要调试一些东西,所以我认为最好将它作为 WAR 部署在外部 Tomcat 服务器上(或者实际上是捆绑在 STS 上的外部 Pivotal tc 服务器)。
我遵循了 Spring Boot's Documentation 上所述的程序,当 运行 应用程序时,我可以看到加载我的控制器、请求等的日志(是吗?不是。)。一旦容器启动,任何请求都会导致丑陋的 404。
我了解 Spring 引导将生成一个 Servlet 3 兼容容器,因此 web.xml
文件不应该是严格要求的。我所要做的就是将我的应用程序的入口点指向扩展 SpringBootServletInitializer
的 class。这是:
package com.company.ci.integration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class GitlabWebhookProcessingApplication extends
SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(GitlabWebhookProcessingApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(GitlabWebhookProcessingApplication.class);
}
}
我将这个 class 指向我的 POM 文件,如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>com.chemtech.ci.integration.GitlabWebhookProcessingApplication</start-class>
<java.version>1.7</java.version>
</properties>
如上面的文档所述,这个 应该 神奇地工作,我的应用程序将按预期加载和工作。
啊,这是日志:
Servlet 映射:
2015-06-07 20:21:16.870 INFO 3373 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-06-07 20:21:16.871 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'errorPageFilter' to: [/*]
2015-06-07 20:21:16.872 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-06-07 20:21:16.872 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
控制器操作映射:
2015-06-07 20:21:20.278 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/webhooks/mergeRequestComment],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.chemtech.ci.integration.controller.WebhookController.MergeRequestCommentReceiver(java.lang.String,com.chemtech.ci.integration.model.MergeRequestCommentEventRequestBody)
2015-06-07 20:21:20.282 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-06-07 20:21:20.282 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
重要的是要强调使用带有嵌入式服务器的可执行 JAR 可以很好地工作。我为此苦思冥想了一段时间,甚至尝试按照其他一些 SO 线程中的说明去做:
Spring Boot - custom 404 page with standalone tomcat
我是不是做错了什么? (好吧,我当然是。这纯属反问)
任何帮助将不胜感激。
谢谢!
好吧,这是一个相当尴尬的答案,但问题是我在 tc 服务器上部署 wars 时忘记了 / Tomcat 默认情况下根上下文将是 WAR 的名称。
因此,虽然 http://server.ip:8080/controller/method
行不通,但 http://server.ip:8080/war-package-name/controller/method
可以很好地工作。
告诫自己,周日晚上工作时永远不要相信自己。
谢谢大家,希望这对以后的人有所帮助!
我正在使用 Spring Boot plus Spring web starter 开发一个简单的应用程序。当我使用嵌入式 Tomcat 服务器(JAR 包装)进行测试时,它运行得非常好。我需要调试一些东西,所以我认为最好将它作为 WAR 部署在外部 Tomcat 服务器上(或者实际上是捆绑在 STS 上的外部 Pivotal tc 服务器)。
我遵循了 Spring Boot's Documentation 上所述的程序,当 运行 应用程序时,我可以看到加载我的控制器、请求等的日志(是吗?不是。)。一旦容器启动,任何请求都会导致丑陋的 404。
我了解 Spring 引导将生成一个 Servlet 3 兼容容器,因此 web.xml
文件不应该是严格要求的。我所要做的就是将我的应用程序的入口点指向扩展 SpringBootServletInitializer
的 class。这是:
package com.company.ci.integration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class GitlabWebhookProcessingApplication extends
SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(GitlabWebhookProcessingApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(GitlabWebhookProcessingApplication.class);
}
}
我将这个 class 指向我的 POM 文件,如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>com.chemtech.ci.integration.GitlabWebhookProcessingApplication</start-class>
<java.version>1.7</java.version>
</properties>
如上面的文档所述,这个 应该 神奇地工作,我的应用程序将按预期加载和工作。
啊,这是日志:
Servlet 映射:
2015-06-07 20:21:16.870 INFO 3373 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-06-07 20:21:16.871 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'errorPageFilter' to: [/*]
2015-06-07 20:21:16.872 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-06-07 20:21:16.872 INFO 3373 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
控制器操作映射:
2015-06-07 20:21:20.278 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/webhooks/mergeRequestComment],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.chemtech.ci.integration.controller.WebhookController.MergeRequestCommentReceiver(java.lang.String,com.chemtech.ci.integration.model.MergeRequestCommentEventRequestBody)
2015-06-07 20:21:20.282 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-06-07 20:21:20.282 INFO 3373 --- [ost-startStop-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
重要的是要强调使用带有嵌入式服务器的可执行 JAR 可以很好地工作。我为此苦思冥想了一段时间,甚至尝试按照其他一些 SO 线程中的说明去做:
Spring Boot - custom 404 page with standalone tomcat
我是不是做错了什么? (好吧,我当然是。这纯属反问)
任何帮助将不胜感激。
谢谢!
好吧,这是一个相当尴尬的答案,但问题是我在 tc 服务器上部署 wars 时忘记了 / Tomcat 默认情况下根上下文将是 WAR 的名称。
因此,虽然 http://server.ip:8080/controller/method
行不通,但 http://server.ip:8080/war-package-name/controller/method
可以很好地工作。
告诫自己,周日晚上工作时永远不要相信自己。
谢谢大家,希望这对以后的人有所帮助!