2016-07-15 8 views
2

Wildfly 8.xで動作する単純なhello worldアプリケーションを取得する際に問題が発生しています。私が受け取るスタックトレースは、レスポンスのヘッダを取得し、nullポインタ例外です:Wildfly 8.xでSpringブートを使用する快適なサービス

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] 

私が想像できる春ブーツ安らかなサービスの最も簡単なまとめ最速を投げた:アプリケーションのメインがある

package com.tryme; 

import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class TrymeController { 
    @RequestMapping(value="/hello") 
    public ResponseEntity<String> hello() 
    { 
     return new ResponseEntity<String>("Hello world.", HttpStatus.OK); 
    } 
} 

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); 
    } 
} 

私は安らかな春のサービスをサポートするために、あなたのポンポンを変更する方法をアドバイスし、いくつかのブログの記事を読んで、これは私が作成したPOMでは(私は3.1サーブレットと2.5の両方で試してみました)。

<?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> 

私はResponseEntitiesでヘッダーを強制しようとしましたが、それは役に立ちませんでした。私はこの単純なアプリケーションを起動して、8.x WildflyのSpring Restで動かすために何かが変わるかどうか教えてもらえますか? 9.xと10.xでうまく動作することを確認しました

編集:ここに私の最新の戦争の様子があります。 enter image description here

+0

だけのノートにも説明を参照してください。 – Gimby

+0

あなたはアプリケーションのための有効なコンテキストを持っていますか?そのようなクラスによって: '@ApplicationPath(" rest ") publicクラスConfigAppはアプリケーションを拡張します{ public ConfigApp(){ } }'? – Hrabosch

+1

* start-class *が間違っています。 'com.ryme.TrymeApplication'より' tryme.TrymeApplication'より – andih

答えて

6

Undertow < 1.1.0-Finalにバグがあります。 Wildfly 8.1ではUndertow 1.0.15を使用しています。 Untertow 1.0.xのnullの応答ヘッダをチェックしませんgetHeaders(String)方法において

// 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)); 
} 

1.1.0アンダートウから上方getHeaders(String)方法は、残念ながら、私は、JBoss /アンダートウ発行ツールで対応するバグレポートを発見していないnull

// 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); 
} 

ためresponseHeadersをチェックします。

だから、これを克服する唯一の方法は、io.undertow.servlet

  • io.undertow.core新しいものとmodules/system/layers/base/io/undertow/

    • io.undertow.servlet.spec.HttpServletResponseImpl

      アップデートを上書き/古い瓶にパッチを適用することです

    対応するディレクトリのmodule.xmlを変更する必要があります。

  • io.undertow.websocket
  • io.undertow.jsp

    • については、ご例えば、それはコアとサーブレットを更新するだけで十分ですわかりません。 可能であれば、最新のwildly 8.2リリースにアップグレードすることをお勧めします。あなたが提供するサーブレットAPIの依存関係を作る必要があり、さもなければ、あなたのアプリケーションの一部として、それを展開するつもりだとあなたは本当にそれを望んでいない:

      は​​

    +0

    ありがとうございました!私はバグがなければならないことを知っていた。無知を許してください。しかし、私は2005年からJBossにいませんでした。どうやってパッチを当てるのですか? :) –

    +0

    グーグルでは、あなたのpomに依存関係を追加するか、アップデートをダウンロードしてサーバーにドロップするように聞こえますか?それは私が最初にやったと思ったことですが、少し狂ったようでした。 :) –

    +0

    はい、それはそれをどのようにパッチするかです。 – andih

    関連する問題