我正在努力在 JBoss EAP 6.4 上部署 Spring Boot War 应用程序(带有 Tiles 视图)。这个应用程序在 Tomcat 8 上运行顺利,但是当我将它部署在 JBoss 上时它没有响应。启动日志没问题,但是当我从浏览器调用控制器时出现错误JBWEB000065。我碰巧从 Eclipse STS 部署并将战争置于独立/部署中。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.codependent.gitprofiles</groupId>
<artifactId>boot3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>boot3</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Servlet 初始化器:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Boot3Application.class);
}
}
Boot3应用程序:
@SpringBootApplication
@RestController
public class Boot3Application {
@RequestMapping("/home")
public String home(){
return "home";
}
public static void main(String[] args) {
SpringApplication.run(Boot3Application.class, args);
}
}
瓷砖配置:
@Configuration
public class TilesConfiguration {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
configurer.setDefinitions(new String[] { "WEB-INF/**/tiles.xml" });
configurer.setCheckRefresh(true);
return configurer;
}
@Bean
public TilesViewResolver tilesViewResolver() {
final TilesViewResolver resolver = new TilesViewResolver();
resolver.setViewClass(TilesView.class);
return resolver;
}
}
启动日志:
[org.jboss.web] (ServerService Thread Pool -- 80) JBAS018210: Registrar el contexto web: /boot3
[org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/boot3]] (ServerService Thread Pool -- 80) Spring WebApplicationInitializers detected on classpath: [org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer@57c6298e, com.codependent.gitprofiles.ServletInitializer@16df6757]
[org.hibernate.validator.internal.util.Version] (background-preinit) HV000001: Hibernate Validator 4.3.2.Final-redhat-2
[stdout] (ServerService Thread Pool -- 80)
[stdout] (ServerService Thread Pool -- 80) . ____ _ __ _ _
[stdout] (ServerService Thread Pool -- 80) /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
[stdout] (ServerService Thread Pool -- 80) ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
[stdout] (ServerService Thread Pool -- 80) \\/ ___)| |_)| | | | | || (_| | ) ) ) )
[stdout] (ServerService Thread Pool -- 80) ' |____| .__|_| |_|_| |_\__, | / / / /
[stdout] (ServerService Thread Pool -- 80) =========|_|==============|___/=/_/_/_/
[stdout] (ServerService Thread Pool -- 80) :: Spring Boot :: (v1.3.3.RELEASE)
[stdout] (ServerService Thread Pool -- 80)
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 80) Mapped "{[/home]}" onto public java.lang.String com.codependent.gitprofiles.Boot3Application.home()
...
在浏览器上调用http://localhost:8080/boot3/home
会显示以下内容,而 JBoss 日志中没有任何内容;
JBWEB000065: HTTP Status 404 - /boot3/error
JBWEB000309: type JBWEB000067: Status report
JBWEB000068: message /boot3/error
JBWEB000069: description JBWEB000124: The requested resource is not available.
JBoss Web/7.5.7.Final-redhat-1
更新:我在 Stackoverflow 上找到了一个解决方案,但在我的情况下它没用:使用server.servlet-path=/*
应用程序开始处理请求,现在调用控制器但它无法呈现Tiles 视图:
Cannot forward to error page for request [/home] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false
我已经在 Tomcat 上检查过,如果我使用server-servlet-path/*
它,它也不起作用(同样的错误),但它适用于/
.
总而言之,在 JBoss 中我不能同时拥有server.servlet-path=/*
(允许在控制器上调用)和server.servlet-path=/
允许 Tiles 视图渲染,那么我该如何解决这个问题呢?