Веб-приложение Spring boot не работает на Tomcat 9 - PullRequest
0 голосов
/ 03 октября 2018

Мое веб-приложение отлично работает на Eclipse Photon STS, java 8 и Spring Boot 2.02 с встроенным tomcat с использованием конечной точки:

http://localhost:8081/DataViewer/tspsPatentSearch

Но когда я компилирую код в файл DataViewer.war (используя пакет mvn) и запустить его на Tomcat 9 в Linux с конечной точкой:

http://myserver.com:8081/DataViewer/tspsPatentSearch

Я получил печально известную:

Whitelabel Error Page
There was an unexpected error (type=Not Found, status=404).
/DataViewer/tspsPatentSearch

Мой файл pom.xml:

`<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<groupId>com.clarivate</groupId>
<artifactId>dataviewer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>dataviewer</name>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <start-class>com.clarivate.dataviewer.DvMain</start-class>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- DS may need to remove for tomcat installation -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

   <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

   <!-- Required to find ojdbc6, because Oracle don't make it available to maven-->
    <repositories>
        <repository>
          <id>codelds</id>
          <url>https://code.lds.org/nexus/content/groups/main-repo</url>
        </repository>
      </repositories>

<build>
    <finalName>DataViewer</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId> 
            <configuration>
                <mainClass>com.clarivate.dataviewer.DvMain</mainClass>
            </configuration>    
        </plugin>
    </plugins>
</build>


<description>TSPS data viewer</description>

В application.properties у меня есть:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.servlet.path=/DataViewer 

Мой основной класс:

package com.clarivate.dataviewer;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication

public class DvMain extends SpringBootServletInitializer {

    static Logger logger = LogManager.getRootLogger();

    public static void main(String[] args) {
        logger.debug("DS1A in main()");
        SpringApplication.run(DvMain.class, args);
        logger.info("DS1C finished.");
    }


    //@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DvMain.class);
     }  
}

Мой MainController.java имеет:

@GetMapping("/tspsPatentSearch")
public String tspsPatentSearch(Model model) {
     model.addAttribute("tspsPatent", new TspsPatent());

     return "tspsPatentSearch";                 
}

Файл war распаковывается нормально и ошибок нет.В catalina.out у нас есть:

2018-10-04 12:09:09.954  INFO 12950 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/tspsPatentSearch],methods=[POST]}" onto public java.lang.String com.clarivate.dataviewer.controller.MainController.tspsPatentSearch(com.clarivate.dataviewer.model.TspsPatent,org.springframework.ui.Model,org.springframework.validation.BindingResult)

и ошибок нет.Я пробовал это т.е. моя структура пакета правильная и это то есть мои jsp находятся в правильном месте (data_viewer \ src \ main \ webapp \ WEB-INF \ jsp) и ясейчас не хватает идей.Любая помощь очень ценится

Редактировать: Если я скопирую tspsPatentSearch.jsp в верхний каталог файла войны, то tomcat найдет его.Похоже, что tomcat игнорирует:

spring.mvc.view.prefix=/WEB-INF/jsp/

или вообще не находит application.properties.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Для подтверждения.Tomcat добавляет имя файла war к конечной точке, поэтому, если мы создадим DataViewerX.war и установим:

server.servlet.path=/DataViewer

, тогда конечная точка при запуске на внешнем tomcat будет:

myServer.com/DataViewerX/DataViewer/tspsPatentSearch 

но когда мы запускаем Eclispe, используя исходный код, конечной точкой является:

http://localhost:8081/DataViewer/tspsPatentSearch

, что немного раздражает, но не является серьезной проблемой.Чтобы обойти это, нужно вызвать файл войны ROOT.war, затем tomcat игнорирует имя файла войны, и 2 конечные точки совпадают, но у меня есть несколько файлов войны в директории webapps, поэтому это решение для меня неприемлемо.Если кто-нибудь знает, как можно разрешить совпадение двух конечных точек, скажите, пожалуйста, но это не так важно.

0 голосов
/ 11 октября 2018

Добавьте это к вашему application.properties:

server.servlet.contextPath=/

Я взял ваш пример кода и, предположив, что вы аннотировали MainController просто как @Controller, собрал развертывание.Я изменил несколько вещей вокруг, но я верю, что именно это и произошло.Я не смог найти никаких ссылок, объясняющих, почему это может потребоваться Tomcat, но я намерен продолжать поиск.Я обновлю вас, если что-нибудь найду.

Редактировать:

Я заметил некоторые дублирующие записи в Spring 2.0.2, связанные с этой проблемой: https://github.com/spring-projects/spring-boot/issues/13470

Проблемаисправлено в 2.0.4, поэтому я обновился.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

Кроме того, я удалил запись server.servlet.contextPath=/ и tada Я все еще могу добраться до настроенного jsp Hello World.Если для вас возможно обновление, возможно, вы могли бы попробовать это, прежде чем добавить что-то в application.properties, что можно было бы считать дублированной функциональностью.По крайней мере, я могу пообещать вам лучший опыт регистрации.

Редактировать # 2:

Пока что нет курящего пистолета, но это (из 2.0.4) может быть связано:

Обеспечивает согласованный способ обнаружения основного пути DispatcherServlet

Сервлеты диспетчера с пользовательским именем сервлета не найдены конечной точкой сопоставлений

Ничто не выглядело вероятным на поверхности сканирования 2.0.3.Сейчас я собираюсь дать ему отдохнуть и дать вам шанс попробовать кое-что.Удачи!

Редактировать # 3:

Извините, что продолжаю предлагать вам переключать среду, но я заметил одно различие между тем, что я тестировал, и тем, с чем вы работаете.вы, кажется, используете Tomcat-9.0.0.M20, где, когда я тестировал с 9.0.12 .

Хотите ли вы обновить или нет, несколько вещей, чтобы отметить и / илиdo:

1) Обновите ваш вопрос тем, что у вас есть сейчас, если он отличается от предыдущего.Включите server.servlet.contextPath=/ в свой application.properties, чтобы кто-нибудь еще, увидев, мог видеть, что вы сделали.

2) Исключение, которое вы имеете для spring-boot-starter-tomcat в spring-boot-starter-web, похоже, ничего не делает- вы можете проверить, сравнив результат выполнения mvn dependency:tree до и после удаления.

3) Я не уверен, что ваша зависимость spring-web также необходима, так как она вводится по умолчанию в spring-boot-starter.

4) Теперь к вашему выводу.Появляется Spring Boot (обратите внимание на баннер), и ваши классы находят и применяют.

catalina.out.DEBUG также в вашем DS.log начиная с 08: 35: 38.162

2018-10-12 09:30:17.322 DEBUG 55745 --- [           main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [/data/apps/tomcat/apache-tomcat-9.0.0.M20/webapps/DataViewer/WEB-INF/classes/com/clarivate/dataviewer/controller/MainController.class]
2018-10-12 09:30:17.328 DEBUG 55745 --- [           main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [/data/apps/tomcat/apache-tomcat-9.0.0.M20/webapps/DataViewer/WEB-INF/classes/com/clarivate/dataviewer/database/ReadFromDb.class]
2018-10-12 09:30:17.356 DEBUG 55745 --- [           main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [/data/apps/tomcat/apache-tomcat-9.0.0.M20/webapps/DataViewer/WEB-INF/classes/com/clarivate/dataviewer/service/FileFuncs.class]
2018-10-12 09:30:17.357 DEBUG 55745 --- [           main] o.s.c.a.ClassPathBeanDefinitionScanner   : Identified candidate component class: file [/data/apps/tomcat/apache-tomcat-9.0.0.M20/webapps/DataViewer/WEB-INF/classes/com/clarivate/dataviewer/service/StringFuncs.class]
...
2018-10-12 09:30:19.417  INFO 55745 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/tspsPatentSearch],methods=[POST]}" onto public java.lang.String com.clarivate.dataviewer.controller.MainController.tspsPatentSearch(com.clarivate.dataviewer.model.TspsPatent,org.springframework.ui.Model,org.springframework.validation.BindingResult)
2018-10-12 09:30:19.417  INFO 55745 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/tspsPatentSearch],methods=[GET]}" onto public java.lang.String com.clarivate.dataviewer.controller.MainController.tspsPatentSearch(org.springframework.ui.Model)
...
2018-10-12 09:30:19.769  INFO 55745 --- [           main] com.clarivate.dataviewer.DvMain          : Started DvMain in 3.125 seconds (JVM running for 5.845)

И я действительно отмечаю сопоставление с /error, которое возвращается для вашего запроса в 09: 32: 11.

Я нахожу это странным:

2018-10-12 09:32:11.758 DEBUG 55745 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/DataViewer/DataViewer/error]

И оно отличается в DS.log:

2018-10-12 08:36:56.136 DEBUG 6992 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/DataViewer /error]

Конкретно /DataViewer/DataViewer/error - пытались ли вы запросить http://localhost:8081/DataViewer/DataViewer/tspsPatentSearch

В общем случае все выглядит так, как будто все идет вверх, но есть неправильная конфигурация, которая не позволяетзапрос на сопоставление с обработчиком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...