You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jersey 2中如何替换com.sun.jersey.guice.spi.container.servlet.GuiceContainer?

替换Jersey 2中缺失的GuiceContainer方案

在Jersey 2.x中确实移除了GuiceContainer,替代方案是使用Jersey官方提供的ServletContainer,并通过Guice-HK2桥接实现Guice与Jersey的依赖注入集成,不需要自定义容器实现。以下是具体步骤:

1. 更新依赖(Maven/Gradle)

首先替换旧的Jersey Guice依赖,添加兼容Java17的Jersey与Guice集成组件:

Maven示例

<!-- Jersey Servlet容器 -->
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.35</version>
</dependency>
<!-- Guice与HK2的桥接模块(Jersey 2默认用HK2做DI,需要桥接Guice) -->
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2-guice-bridge</artifactId>
    <version>2.35</version>
</dependency>
<!-- 兼容Java17的Guice Servlet扩展 -->
<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-servlet</artifactId>
    <version>5.1.0</version> <!-- 5.x版本支持Java17,避免用4.x版本的兼容问题 -->
</dependency>

2. 配置Jersey ResourceConfig(桥接Guice)

创建自定义的ResourceConfig,负责注册Jersey资源并完成Guice与HK2的桥接,让Jersey能使用Guice管理的Bean:

import com.google.inject.Injector;
import org.glassfish.jersey.inject.hk2.GuiceBridge;
import org.glassfish.jersey.inject.hk2.GuiceIntoHK2Bridge;
import org.glassfish.jersey.server.ResourceConfig;

public class JerseyAppConfig extends ResourceConfig {
    public JerseyAppConfig(Injector injector) {
        // 注册你的Jersey资源类(比如TestResource)
        register(TestResource.class);
        
        // 初始化Guice-HK2桥接,让Jersey的DI容器能访问Guice的Injector
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(getServiceLocator());
        GuiceIntoHK2Bridge guiceBridge = getServiceLocator().getService(GuiceIntoHK2Bridge.class);
        guiceBridge.bridgeGuiceInjector(injector);
    }
}

3. 修改GuiceServletContextListener配置

将原来的GuiceContainer替换为ServletContainer,并配置Jersey的启动参数:

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;

import java.util.HashMap;
import java.util.Map;

public class AppGuiceConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                // 配置Jersey Servlet参数
                Map<String, String> jerseyParams = new HashMap<>();
                // 指定自定义的ResourceConfig类(让ServletContainer加载这个配置)
                jerseyParams.put(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyAppConfig.class.getName());
                
                // 替换原GuiceContainer为ServletContainer
                serve("/test/*").with(ServletContainer.class, jerseyParams);
                
                // 继续绑定你的业务服务到Guice
                bind(TestService.class).to(TestServiceImpl.class);
            }
        });
    }
}

关键说明

  • Jersey 2.x默认使用HK2作为依赖注入容器,通过jersey-hk2-guice-bridge可以让HK2复用Guice的Injector,实现两者的DI互通。
  • 确保Guice版本使用5.x及以上,避免Java17下的反射权限问题(Java9+对反射访问有更严格的限制)。
  • 不需要自定义容器实现,ServletContainer是Jersey官方提供的标准Servlet入口,完全替代旧的GuiceContainer功能。

内容的提问来源于stack exchange,提问作者Lia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:06:32