Spring Boot Web应用程序无法在Tomcat 9上运行

时间:2018-10-03 13:33:58

标签: java maven jsp spring-boot tomcat

我的Web应用程序在带有端点的嵌入式tomcat的Eclipse Photon STS,java 8和Spring Boot 2.02上运行良好:

http://localhost:8081/DataViewer/tspsPatentSearch

但是当我将代码编译到DataViewer.war文件(使用mvn包)并在Linux上的Tomcat 9上运行时 端点:

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)

,没有错误。我尝试过this,即我的包结构正确,而this即我的jsp位于正确的位置(data_viewer \ src \ main \ webapp \ WEB-INF \ jsp) 现在我的想法不多了。任何帮助表示赞赏

编辑:如果我将tspsPatentSearch.jsp复制到war文件的顶层目录中,则tomcat会找到它。因此,似乎tomcat正在忽略:

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

或者根本找不到application.properties。

2 个答案:

答案 0 :(得分:1)

确认。 Tomcat将war文件名添加到端点,因此如果我们创建DataViewerX.war并设置为:

server.servlet.path=/DataViewer

然后在外部tomcat上运行时的终点是:

myServer.com/DataViewerX/DataViewer/tspsPatentSearch 

但是当我们使用源代码在Eclispe上运行时,终点是:

http://localhost:8081/DataViewer/tspsPatentSearch

这有点烦人,但不是主要问题。一种解决方法是调用war文件ROOT.war,然后tomcat忽略war文件名,并且两个端点相同,但是我在webapps目录中有多个war文件,因此该解决方案对我来说不可接受。 如果有人知道有一种方法可以让两个端点相同,那么请这么说,但这并不重要。

答案 1 :(得分:0)

将此添加到您的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 仍然可以访问我设置的Hello World jsp。如果您可以升级,也许您可​​以尝试在向application.properties添加某些东西之前尝试一下,这可以被认为是重复的功能。至少我可以向您保证会提供更好的日志记录体验。

编辑#2:

到目前为止,还没有吸烟枪,但是这些(从2.0.4起)可能与以下情​​况有关:

Provide a consistent way to discover the primary DispatcherServlet's path

Dispatcher servlets with a custom servlet name are not found by the mappings endpoint

2.0.3的表面扫描看起来没有什么可能。我现在要休息一下,让您有机会尝试一些东西。祝你好运!

编辑#3:

很抱歉继续建议您切换环境,但是我注意到我所测试的内容与正在使用的内容之间的区别是您似乎在使用Tomcat-9.0.0.M20用9.0.12测试。

您是否要升级,需要注意和/或做一些事情:

1)如果问题与以前有所不同,请使用您现在所拥有的知识更新您的问题。在您的server.servlet.contextPath=/中加入application.properties,以便其他任何人都可以看到您所做的事情。

2)spring-boot-starter-tomcatspring-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)

我确实注意到在09:32:11为您的请求返回的到/error的映射。

我觉得很奇怪:

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

通常,这似乎一切都在进行,但是某处存在配置错误,不允许将请求映射到处理程序。