2016-08-21 6 views
1

Jersey 2.22.1 버전에서 2.22.2 버전으로 업그레이드 할 수 없습니다.
계층 :
Jersey 2.22.1에서 Jersey 2.22.2

def jerseyVersion = '2.22.1' 
def hk2Version = '2.4.0-b31' 
def giuceVersion = '4.0' 

dependencies { 
    //javax 
    compile "javax.servlet:javax.servlet-api:3.1.0" 
    //jersey 
    compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}" 
    compile "org.glassfish.jersey.containers:jersey-container-servlet:${jerseyVersion}" 
    //hk2 
    compile "org.glassfish.hk2:guice-bridge:${hk2Version}" 
    //guice 
    compile "com.google.inject:guice:${giuceVersion}" 
    compile "com.google.inject.extensions:guice-servlet:${giuceVersion}" 
} 

파일의 web.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <display-name>REST API App</display-name> 

    <listener> 
     <listener-class>com.example.core.JerseyGuiceServletContextListener</listener-class> 
    </listener> 

    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

클래스 JerseyGuiceServletContextListener :

build.gradle에서
enter image description here
종속성 섹션 10

클래스 JerseyServletModuleConfig :

package com.example.core; 

import com.google.inject.Scopes; 
import com.google.inject.servlet.ServletModule; 
import com.example.ws.HeyResource; 
import org.glassfish.jersey.servlet.ServletContainer; 

import java.util.Map; 
import java.util.TreeMap; 

class JerseyServletModuleConfig extends ServletModule { 
    @Override 
    protected void configureServlets() { 
     Map<String, String> servletContainerParams = new TreeMap<>(); 
     servletContainerParams.put("javax.ws.rs.Application", JerseyConfiguration.class.getCanonicalName()); 
     bind(ServletContainer.class).in(Scopes.SINGLETON); 
     filter("/*").through(ServletContainer.class, servletContainerParams); 
     bind(HeyResource.class).in(Scopes.SINGLETON); 
    } 
} 

클래스 JerseyConfiguration는 : 버전 2.22.1 뉴저지 모든 것을

package com.example.core; 

import com.google.inject.Injector; 
import org.glassfish.hk2.api.ServiceLocator; 
import org.glassfish.jersey.server.ResourceConfig; 
import org.jvnet.hk2.guice.bridge.api.GuiceBridge; 
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge; 

import javax.inject.Inject; 
import javax.servlet.ServletContext; 

class JerseyConfiguration extends ResourceConfig { 
    @Inject 
    public JerseyConfiguration(ServiceLocator serviceLocator, ServletContext servletContext) { 
     packages("com.example.ws"); 
     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
     guiceBridge.bridgeGuiceInjector((Injector) servletContext.getAttribute(Injector.class.getName())); 
    } 
} 

완벽하게 작동합니다.

21 8 월 2016 12 : 34 : 12.577 SEVERE [로컬 호스트-startStop-1] org.apache.catalina.core - 최대한 빨리 2.22.2에 버전을 변경하면 나는 예외를 얻었다 .StandardContext.filterStart 예외 org.glassfish.jersey.servlet.ServletContainer.init에서 org.glassfish.jersey.servlet.init.FilterUrlMappingsProviderImpl.getFilterUrlMappings (FilterUrlMappingsProviderImpl.java:66) 에서 필터 guiceFilter java.lang.NullPointerException이 시동 (ServletContainer.java:444)

나는 그것이 guice 다리 버전에서 다룰 수있는 문제를 생각했다. 필자는 2.4.0-b31 버전을 org.glassfish.jersey.core : jersey-server의 다양한 hk2 종속성에 사용되는 2.4.0-b34 버전으로 대체했습니다. - 도움이되지 않았습니다. 클래스 FilterUrlMappingsProviderImpl에

링크 : https://github.com/jersey/jersey/blob/79d7767be5102f57520cf23900cad3a7ef4230ad/containers/jersey-servlet/src/main/java/org/glassfish/jersey/servlet/init/FilterUrlMappingsProviderImpl.java

설명 클래스 FilterUrlMappingsProviderImpl 위의 링크는이 FilterRegistration 클래스 개체를 가져 불가능하다는 것을 분명해진다.

어떤 문제가있을 수 있습니까? 그녀의 결정에 대해 당신은 무엇을 조언 할 수 있습니까? 감사합니다. .

답변

0

솔루션


파일의 web.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <display-name>REST API App</display-name> 

    <listener> 
     <listener-class>com.example.core.JerseyGuiceServletContextListener</listener-class> 
    </listener> 

    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <filter-name>jerseyFilter</filter-name> 
     <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.example.core.JerseyConfiguration</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>jerseyFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

클래스 JerseyServletModuleConfig :

package com.example.core; 

import com.google.inject.Scopes; 
import com.google.inject.servlet.ServletModule; 
import com.example.ws.HeyResource; 
import org.glassfish.jersey.servlet.ServletContainer; 

import java.util.Map; 
import java.util.TreeMap; 

class JerseyServletModuleConfig extends ServletModule { 
    @Override 
    protected void configureServlets() { 
     bind(HeyResource.class).in(Scopes.SINGLETON); 
    } 
}