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

http://forum.spring.io/forum/spring-projects/web/745458-spring-boot-v1-0-0-rc3-not-resolving-views-404-error(不完全相关)

我是不是做错了什么? (好吧,我当然是。这纯属反问)

任何帮助将不胜感激。

谢谢!

好吧,这是一个相当尴尬的答案,但问题是我在 tc 服务器上部署 wars 时忘记了 / Tomcat 默认情况下根上下文将是 WAR 的名称。

因此,虽然 http://server.ip:8080/controller/method 行不通,但 http://server.ip:8080/war-package-name/controller/method 可以很好地工作。

告诫自己,周日晚上工作时永远不要相信自己。

谢谢大家,希望这对以后的人有所帮助!