分析了整个互联网,但无法弄清楚为什么会发生这种情况。我有一个最简单的项目(使用jersey-quickstart- grizzly2原型),并且只有一个Jersey资源。我将Guice用作DI,因为CDI也不想与Jersey合作。问题在于,Guice在注入Jersey的资源时无法解析要使用的类。它在外面很好用,但不适用于泽西岛。这是泽西岛的资源:
import com.google.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("api") public class MyResource { private Transport transport; @Inject public void setTransport(Transport transport) { this.transport = transport; } @GET @Produces(MediaType.TEXT_PLAIN) public String getIt() { return transport.encode("Got it!"); } }
传输接口:
public interface Transport { String encode(String input); }
它的实现:
public class TransportImpl implements Transport { @Override public String encode(String input) { return "before:".concat(input).concat(":after"); } }
遵循Google的Getting Started手册,我继承AbstractModule并绑定了我的类,如下所示:
AbstractModule
public class TransportModule extends AbstractModule { @Override protected void configure() { bind(Transport.class).to(TransportImpl.class); } }
我可以使用喷油器main(),但是在这里并不需要它:
main()
Injector injector = Guice.createInjector(new TransportModule());
顺便说一句,当我尝试这样做时没有问题:
Transport transport = injector.getInstance(Transport.class);
泽西岛2已经拥有一个DI框架HK2。您可以使用它,也可以根据需要使用HK2 / Guice桥将您的Guice模块与HK2连接起来。
如果您想使用HK2,那么从最基本的角度来说,它与Guice模块没什么不同。例如,在您当前的代码中,您可以执行此操作
public class Binder extends AbstractBinder { @Override public void configurer() { bind(TransportImpl.class).to(Transport.class); } }
然后只需在泽西岛注册活页夹
new ResourceConfig().register(new Binder());
区别之一是绑定声明。在Guice中,它“将合同绑定到实施”,而在HK2中,它“将实施绑定到合同”。您可以看到它与Guice模块相反。
如果您想桥接Guice和HK2,则要复杂一些。您需要了解有关HK2的更多信息。这是一个如何使其工作的示例
@Priority(1) public class GuiceFeature implements Feature { @Override public boolean configure(FeatureContext context) { ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(context); GuiceBridge.getGuiceBridge().initializeGuiceBridge(locator); Injector injector = Guice.createInjector(new TransportModule()); GuiceIntoHK2Bridge guiceBridge = locator.getService(GuiceIntoHK2Bridge.class); guiceBridge.bridgeGuiceInjector(injector); return true; } }
然后注册功能
new ResourceConfig().register(new GuiceFeature());
就个人而言,如果您要使用Jersey,我建议您熟悉HK2。
也可以看看:
抱歉,我忘了补充说明,以使用Guice Bridge,您需要依赖。
<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>guice-bridge</artifactId> <version>2.4.0-b31</version> </dependency>
请注意,这是Jersey 2.22.1附带的依赖项。如果您使用的是HK2的其他版本,则应确保使用与Jersey版本相同的HK2版本。