- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的网络应用程序在 Eclipse Photon STS、java 8 和 Spring Boot 2.02 上运行良好,带有使用端点的嵌入式 tomcat:
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
我的主要类(class)是:
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。
最佳答案
将此添加到您的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-web
下对 spring-boot-starter-tomcat
的排除似乎没有做任何事情 - 你可以验证通过比较删除前后运行 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
一般来说,这似乎一切正常,但某处存在错误配置,不允许请求映射到处理程序。
关于java - Spring Boot Web 应用程序未在 tomcat 9 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628246/
我是一名优秀的程序员,十分优秀!