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
相关产品推荐
相关产品推荐

