2016-07-15 7 views
2

У меня возникли проблемы с получением простого приветствия мирового приложения для работы с Wildfly 8.x. Трассировка стеки я получаю это пустое исключение указателя получают заголовки ответа:Restful services with Spring Boot на 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] 

я бросил вместе быстрые Простейшими Spring Загрузочной успокоительной службы я мог себе представить:

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, чтобы поддержать успокоительные пружинные услуги, и это 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, и это не помогло. Может ли кто-нибудь сказать мне, есть ли что-нибудь, что я могу изменить, чтобы получить это простое приложение и запустить с Spring Rest на 8.x Wildfly? Я подтвердил, что он отлично работает на 9.x и 10.x

Редактировать: вот что выглядит моя последняя война. enter image description here

+0

Только примечание: вы должны сделать зависимость сервлет-апи при условии, или же вы собираетесь развернуть его как часть вашего приложения, и вы действительно не хотите этого. – Gimby

+0

У вас есть допустимый контекст для приложения, например, следующим классом: '@ApplicationPath (« rest ») public class ConfigApp extends Application { public ConfigApp() { } }'? – Hrabosch

+1

* Стартовый класс * неправильный. Это должно быть: 'com.tryme.TrymeApplication'rather, чем' tryme.TrymeApplication' – andih

ответ

6

Исправлена ​​ошибка в Undertow < 1.1.0-Final. Wildfly 8.1 использует Undertow 1.0.15.

В Untertow 1.0.xgetHeaders(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)); 
} 

От Undertow 1.1.0 вверх на getHeaders(String) метод проверяют responseHeaders для 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); 
} 

К сожалению, я не нашел соответствующее сообщение об ошибке в инструменте выпуска JBoss/прибойным.

Таким образом, единственный способ преодолеть это пропатчить/Перезапишите io.undertow.servlet.spec.HttpServletResponseImpl

Обновить старые банки в modules/system/layers/base/io/undertow/ с новыми

  • io.undertow.core
  • io.undertow.servlet

Вы должны изменить module.xml в соответствующем каталоге.

Не уверен

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

Для примера этого достаточно, чтобы обновить ядро ​​и сервлет. Лучшее обновление до последней дикой версии 8.2, если возможно.

Смотрите также обсуждение на JBoss forum

+0

Большое спасибо! Я знал, что должна быть ошибка. Извините невежество, но я не был на JBoss с 2005 года. Как бы я пошел на исправление? :) –

+0

Googling, похоже, вы просто добавляете зависимости в своем pom или загружаете обновления и бросаете их на свой сервер? Это то, что я считал делать в первую очередь, но это казалось немного сумасшедшим. :) –

+0

Да, это способы его исправления. – andih

Смежные вопросы