Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Wildfly 8.x上使用Spring引导的Restful服务_Java_Rest_Maven_Spring Boot_Wildfly 8 - Fatal编程技术网

Java 在Wildfly 8.x上使用Spring引导的Restful服务

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

我在获取一个简单的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.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);
}