Java 在Wildfly 8.x上使用Spring引导的Restful服务
我在获取一个简单的hello world应用程序以在Wildfly 8.x上运行时遇到问题。我收到的堆栈跟踪是一个获取响应头的空指针异常:Java 在Wildfly 8.x上使用Spring引导的Restful服务,java,rest,maven,spring-boot,wildfly-8,Java,Rest,Maven,Spring Boot,Wildfly 8,我在获取一个简单的hello world应用程序以在Wildfly 8.x上运行时遇到问题。我收到的堆栈跟踪是一个获取响应头的空指针异常: 2016-07-15 04:14:28,488 ERROR [org.springframework.boot.context.web.ErrorPageFilter] (default task-4) Forwarding to error page from request [/hello] due to exception [null]: java.l
2016-07-15 04:14:28,488 ERROR [org.springframework.boot.context.web.ErrorPageFilter] (default task-4) Forwarding to error page from request [/hello] due to exception [null]: java.lang.NullPointerException
at java.util.ArrayList.<init>(ArrayList.java:177) [rt.jar:1.8.0_92]
at io.undertow.servlet.spec.HttpServletResponseImpl.getHeaders(HttpServletResponseImpl.java:248) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
at javax.servlet.http.HttpServletResponseWrapper.getHeaders(HttpServletResponseWrapper.java:303) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at org.springframework.http.server.ServletServerHttpResponse$ServletResponseHttpHeaders.get(ServletServerHttpResponse.java:160) [spring-web-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.http.server.ServletServerHttpResponse$ServletResponseHttpHeaders.containsKey(ServletServerHttpResponse.java:142) [spring-web-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.addContentDispositionHeader(AbstractMessageConverterMethodProcessor.java:346) [spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:238) [spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
我读了几篇博客文章,建议如何更改pom以支持restfulspring服务,这就是我创建的pom(我尝试了3.1servlet和2.5)
4.0.0
com.tryme
在Undertow<1.1.0-Final中有一个bug。Wildfly 8.1使用了Undertow 1.0.15
在Untertow 1.0.x中,getHeaders(String)
方法不会检查响应头是否为null
// from Undertow 1.0.15-final
// http://grepcode.com/file/repo1.maven.org/maven2/io.undertow/undertow-servlet/1.0.15.Final/io/undertow/servlet/spec/HttpServletResponseImpl.java#HttpServletResponseImpl.getHeaders%28java.lang.String%29
@Override
public Collection<String> getHeaders(final String name) {
return new ArrayList<String>(exchange.getResponseHeaders().get(name));
}
不幸的是,我在JBoss/undertowissue工具中没有找到相应的bug报告
因此,克服这一问题的唯一方法是修补/覆盖io.undertow.servlet.spec.HttpServletResponseImpl
用新的jar更新模块/系统/层/base/io/undertow/
中的旧jar
- io.undertow.core
- io.undertow.servlet
您必须修改相应目录中的module.xml
不确定
- io.undertow.jsp
- io.undertow.websocket
对于您的示例,更新核心和servlet就足够了。
如果可能,最好升级到最新的8.2版本
另请参见关于的讨论。请注意:您必须提供servlet api依赖项,否则您将要将其作为应用程序的一部分进行部署,但您确实不希望这样。您是否有一个有效的应用程序上下文,即,按类:@ApplicationPath(“rest”)公共类ConfigApp扩展应用程序{public ConfigApp(){}}
?start类是错误的。它应该是:com.tryme.TrymeApplication
而不是tryme.TrymeApplication
生成的war包含tomcat embed el.jar
,即使您已经按照提供的标记了spring boot starter tomcat.jar
。您必须明确地排除它。好的,我已经更正了pom以反映t这些建议,我得到了同样的结果。值得一提的是,当我在Spring MVC中使用rest服务而不是Spring Boot时,我得到了同样的结果。如果我在Wildfly 9.x或10.x上部署相同的应用程序,它会起作用。但是,我最终尝试将我的应用程序部署到JBPM上,它将根据版本的不同而定位于8.2或8.1上。谢谢太多了!我知道一定有个bug。请原谅我的无知,但我从2005年起就没有使用过JBoss。我该如何修补undertow?:)谷歌,听起来你只是在pom中添加依赖项,或者下载更新并将其放入服务器?这是我一开始考虑的,但似乎有点疯狂.:)是的,这就是修补它的方法。实际上,JBPM 6.4附带了一个版本的Wildfly(8.2.1),该版本可与Spring REST一起使用。但是,如果您将Spring工具套件添加到Eclipse的版本中,它将配置为下载(MARS),您需要从更新站点本身而不是从市场下载Spring工具套件:非常感谢您的解决方案。节省了我的时间。我想这就是问题所在
package com.tryme;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan
public class TrymeApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(TrymeApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(TrymeApplication.class);
}
}
<?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.tryme</groupId>
<artifactId>tryme</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>tryme</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>
<properties>
<start-class>com.tryme.TrymeApplication</start-class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</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>
<!--
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<!--We are building spring boot application with maven-->
<build>
<finalName>tryme</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--Repositories for spring libs-->
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!--Repositories for needed plugins -->
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
// from Undertow 1.0.15-final
// http://grepcode.com/file/repo1.maven.org/maven2/io.undertow/undertow-servlet/1.0.15.Final/io/undertow/servlet/spec/HttpServletResponseImpl.java#HttpServletResponseImpl.getHeaders%28java.lang.String%29
@Override
public Collection<String> getHeaders(final String name) {
return new ArrayList<String>(exchange.getResponseHeaders().get(name));
}
// from Undertow 1.1.0-final
// http://grepcode.com/file/repo1.maven.org/maven2/io.undertow/undertow-servlet/1.1.0.Final/io/undertow/servlet/spec/HttpServletResponseImpl.java#HttpServletResponseImpl.getHeader%28java.lang.String%29
@Override
public Collection<String> getHeaders(final String name) {
HeaderValues headers = exchange.getResponseHeaders().get(name);
if(headers == null) {
return Collections.emptySet();
}
return new ArrayList<>(headers);
}