当前位置: 首页 > 知识库问答 >
问题:

迁移Jersey 2.22.1到Jersey 2.22.2

赵明亮
2023-03-14

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

2016年8月21日12:34:12.577严重[localhost-startStop-1]org.apache.catalina.core.standardcontext.filterStart异常启动过滤器guiceFilter java.lang.nullpointerException at org.glassfish.jersey.servlet.init.filterurlmappingsproviderimpl.getfilterurlmappings(filterurlmappingsproviderimpl.java:66)at org.glassfish.jersey.servlet.servletcontainer.init(

我认为这个问题可以在Guice-Bridge版本中解决。我已经从2.4.0-B31版本替换为2.4.0-B34版本(用于各种HK2依赖关系,来自org.glassfish.jersey.core:jersey-server)-没有帮助。

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

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

会有什么问题存在?你对她的决定有什么建议?谢了。

共有1个答案

尉迟景福
2023-03-14

解决方案

文件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);
    }
}
 类似资料:
  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。

  • Redux 不是一个单一的框架,而是一系列的约定和一些让他们协同工作的函数。你的 Redux 项目的主体代码甚至不需要使用 Redux 的 API,大部分时间你其实是在编写函数。 这让到 Redux 的双向迁移都非常的容易。 我们可不想把你限制得死死的! 从 Flux 项目迁移 Reducer 抓住了 Flux Store 的本质,因此,将一个 Flux 项目逐步到 Redux 是可行的,无论你使

  • 我正试图迁移到AndroidX,我们在我们的项目中使用这个库。然而,这目前在我们的项目中引起了一个问题: 无法解析对“module @ build type/compile class path”的依赖项:无法使用转换JetifyTransform转换文件“localytics-1.3.0.aar”以匹配属性{artifactType=processed-aar} 删除库会使此问题消失。在这个库被

  • 如果你现在有一个正在使用其他 VCS 的代码库,但是你已经决定开始使用 Git,必须通过某种方式将你的项目迁移至 Git。 这一部分会介绍一些通用系统的导入器,然后演示如何开发你自己定制的导入器。 你将会学习如何从几个大型专业应用的 SCM 系统中导入数据,不仅因为它们是大多数想要转换的用户正在使用的系统,也因为获取针对它们的高质量工具很容易。 Subversion 如果你阅读过前面关于 git

  • 对于 iOS 自动化,Appium 依赖苹果提供的系统框架。对于 iOS 9.2 及更低版本,苹果唯一的自动化技术被称为UIAutomation,它运行在 “Instruments” 中。从 iOS 10 开始,苹果已经完全删除了 UIAutomation 工具,因此 Appium 不可能按照以前的方式进行测试。同时,苹果推出了一款名为 XCUITest 的新型自动化技术,从 iOS 9.3 到

  • 关于此文档 SQLAlchemy 2.0为核心组件和ORM组件中的各种关键SQLAlchemy使用模式带来了重大转变。这个版本的目标是对SQLAlchemy早期以来的一些最基本的假设做一点小小的调整,并提供一个新的简化的使用模型,这个模型希望在核心和ORM组件之间更加简洁和一致,并且更加有能力。Python从python3变成python3以及python3逐渐出现的类型系统是这种转变的最初启示,

  • 我找遍了,但看不出有没有办法。我有两个LXC容器在Ubuntu 14.04主机上运行Ubuntu 14.04。它们对我来说非常重要,所以我希望在主机硬件出现故障时能够轻松地将LXC容器备份/迁移到另一台服务器。 我现在已经用LXD构建了一个新的Ubuntu 15.1服务器,并且已经注销并返回并看到了新的组。为了测试,我用我14.04主机上的开关将我现有的一个LXC容器连接起来: ---然后在新服务

  • 声明 接受LoggerFactory的对org.apache.Log4j.logger.getLogger的调用必须删除org.apache.Log4j.spi.LoggerFactory并使用Log4J2的其他扩展机制之一。 log4j2中有哪些扩展机制,以及如何在log4j2中最好地迁移如下所示的方法