【问题标题】:Migration Jersey 2.22.1 to Jersey 2.22.2将泽西岛 2.22.1 迁移到泽西岛 2.22.2
【发布时间】:2016-08-21 11:52:25
【问题描述】:

无法从 Jersey 2.22.1 版本升级到 2.22.2 版本。
层次结构:

build.gradle 中的依赖项部分:

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:

package com.example.core;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class JerseyGuiceServletContextListener extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new JerseyServletModuleConfig());
    }
}

类 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:

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

在泽西岛 2.22.1 版本中,一切正常。一旦我在 2.22.2 上更改版本 - 我就遇到了一个异常:

2016 年 8 月 21 日 12:34:12.577 严重 [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart 异常 开始过滤器 guiceFilter java.lang.NullPointerException 在 org.glassfish.jersey.servlet.init.FilterUrlMappingsProviderImpl.getFilterUrlMappings(FilterUrlMappingsProviderImpl.java:66) 在 org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:444)

我认为一个问题可以在 guice-bridge 版本中解决。我已将 2.4.0-b31 版本替换为 2.4.0-b34 版本(用于 org.glassfish.jersey.core:jersey-server 的各种 hk2 依赖项) - 没有帮助。

类FilterUrlMappingsProviderImpl的链接:https://github.com/jersey/jersey/blob/79d7767be5102f57520cf23900cad3a7ef4230ad/containers/jersey-servlet/src/main/java/org/glassfish/jersey/servlet/init/FilterUrlMappingsProviderImpl.java

从上面描述的类 FilterUrlMappingsProviderImpl 的链接中可以清楚地看出,不可能获得 FilterRegistration 类对象。

可能存在什么问题?你对她的决定有何建议? 谢谢。

【问题讨论】:

    标签: java jersey guice jersey-2.0


    【解决方案1】:

    解决方案


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

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 2011-08-02
      • 2017-05-13
      • 2013-12-21
      • 1970-01-01
      • 2011-10-14
      • 2019-03-13
      • 2011-08-26
      相关资源
      最近更新 更多