Mi aplicación web funciona bien en Eclipse, Java Photon STS 8 y el resorte de arranque 2.02 con el Embebido Tomcat mediante criterio de valoración:
http://localhost:8081/DataViewer/tspsPatentSearch
Pero cuando compilo el código en el archivo DataViewer.war (utilizando el paquete de MVN) y ejecutarlo en Tomcat 9 en Linux con punto final:
http://myserver.com:8081/DataViewer/tspsPatentSearch
Me da la infame:
Whitelabel Error Page
There was an unexpected error (type=Not Found, status=404).
/DataViewer/tspsPatentSearch
Mi pom.xml es:
`<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>
En application.properties que tengo:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.servlet.path=/DataViewer
Mi clase principal es:
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);
}
}
Mi MainController.java tiene:
@GetMapping("/tspsPatentSearch")
public String tspsPatentSearch(Model model) {
model.addAttribute("tspsPatent", new TspsPatent());
return "tspsPatentSearch";
}
El archivo de la guerra descomprime bien y no hay errores. En catalina.out tenemos:
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)
y no hay errores. He intentado esta decir que mi estructura del paquete es correcta y esta es decir, mis de JSP son en la ubicación correcta (data_viewer \ src \ Main \ webapp \ WEB-INF \ JSP) y ahora estoy quedando sin ideas. Cualquier ayuda muy apreciada
Editar: Si copio tspsPatentSearch.jsp en el directorio superior archivo de la guerra entonces Tomcat encuentra. Así que parece que Tomcat está ignorando:
spring.mvc.view.prefix=/WEB-INF/jsp/
o no encontrar application.properties en absoluto.
Agregue esto a su application.properties
:
server.servlet.contextPath=/
Me he tomado el código de muestra y, suponiendo que su anotada MainController
simplemente como @Controller
, poner un despliegue juntos. He cambiado algunas cosas por ahí, pero creo que esta era la parte que lo hizo. No he podido encontrar ninguna referencia que explican por qué podría ser requerido por Tomcat, pero tengo la intención de seguir buscando. Voy a actualizar que si encuentro algo.
Editar:
Me di cuenta de algunos de registro duplicado en la primavera 2.0.2 relacionado con este tema: https://github.com/spring-projects/spring-boot/issues/13470
El problema parecía fijo en 2.0.4 por lo tanto, he actualizado.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
Además, me quita la server.servlet.contextPath=/
entrada y Tada Todavía puedo llegar a la Hello World JSP He definido. Si la actualización es posible para usted, tal vez usted podría intentar que antes de añadir algo a application.properties
lo que podría considerarse la funcionalidad duplicada. Al menos yo puedo prometer una mejor experiencia de la explotación forestal.
Editar # 2:
Sin pistola humeante, hasta el momento, pero éstos (de 2.0.4) podría estar relacionada:
Proporcionar una manera consistente para descubrir la ruta primaria de DispatcherServlet
Nada parecía probable que en una exploración de superficie de 2.0.3. Voy a darle un descanso por ahora y le dará la oportunidad de probar algunas cosas. ¡Buena suerte!
Editar # 3:
Lo siento para continuar sugiriendo que cambiar cosas ambiente a su alrededor, pero una diferencia entre lo que he observado que probé y lo que va a trabajar tiene que parece estar utilizando Tomcat-9.0.0.M20 donde como estaba probando con 9,0 0.12 .
Tanto si desea actualizar o no, algunas cosas a tener en cuenta y / o hacen:
1) Modificar una pregunta con lo que tienes ahora si es diferente a la anterior. Incluir el server.servlet.contextPath=/
en su application.properties
tan una persona que quiere puede ver lo que has hecho.
2) La exclusión que tiene para spring-boot-starter-tomcat
bajo spring-boot-starter-web
no parece hacer nada - se puede comprobar comparando el resultado de la ejecución mvn dependency:tree
antes y después de la eliminación.
3) No estoy seguro de que su spring-web
dependencia es necesario tampoco, ya que es traído por defecto bajo el spring-boot-starter
.
4) Ahora a su salida. Primavera de arranque está subiendo (nota de la bandera) y sus clases se están encontrando y actuar en consecuencia.
catalina.out.DEBUG
También en su Ds.log comenzando ~ 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)
Y además observo la asignación a /error
que se devuelve a su petición en 9:32:11.
Me parece extraño:
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]
Y es diferente en 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]
Específicamente /DataViewer/DataViewer/error
- ¿Has probado que solicita http: // localhost: 8081 / DataViewer / DataViewer / tspsPatentSearch
En general, esto parece como si todo está subiendo, pero hay una mala configuración en alguna parte que no está permitiendo una solicitud para asignar al controlador.