Приложение Spring Boot MVC возвращает HTTP 404 при развертывании на внешнем экземпляре сервера Tomcat/tc.

Я разрабатываю простое приложение, используя Spring Boot плюс веб-стартер Spring. Все идет очень хорошо, когда я тестирую встроенный сервер Tomcat (упаковка JAR). Мне нужно отладить некоторые вещи, поэтому я подумал, что было бы лучше развернуть его как WAR на внешнем сервере Tomcat (или на самом деле внешний сервер Pivotal tc, связанный с STS).

Я следовал процедурам, указанным в Документация по Spring Boot, и при запуске приложения я вижу журналы загрузки моих контроллеров, запросов и т. д. (да? нет.). Как только контейнер запущен, любые запросы приводят к уродливой ошибке 404.

Я понимаю, что Spring Boot создаст контейнер, совместимый с Servlet 3, поэтому файл web.xml не должен быть строго обязательным. Все, что мне нужно сделать, это указать точку входа моего приложения на класс, который расширяет SpringBootServletInitializer. Вот:

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);
    }

}

Я указываю этот класс в моем файле 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>

Как указано в документации выше, это должно работать волшебным образом, и мое приложение будет загружено и будет работать, как и ожидалось.

А вот и логи:

Сопоставления сервлетов:

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 — пользовательская страница 404 с автономным котом

http://forum.spring.io/forum/spring-projects/web/745458-spring-boot-v1-0-0-rc3-not-resolving-views-404-error ( не совсем по делу)

Я делаю что-то не так здесь? (ну конечно я. это чисто риторический вопрос)

Любая помощь будет высоко ценится.

Спасибо!


person Gustavo Ramos    schedule 07.06.2015    source источник


Ответы (1)


Что ж, это довольно смущающий ответ, но проблема в том, что я забыл при развертывании войн на tc Server / Tomcat корневым контекстом по умолчанию будет имя WAR.

Итак, пока http://server.ip:8080/controller/method не сработает, http://server.ip:8080/war-package-name/controller/method прекрасно работает.

На заметку себе: никогда не доверяйте себе, работая воскресным вечером.

Спасибо всем, и надеюсь, что это поможет кому-то в будущем!

person Gustavo Ramos    schedule 08.06.2015
comment
Вам нужно было указать jboss-web.xml и web.xml, чтобы определить свой собственный корневой контекст? - person Charles Morin; 17.04.2018