小编典典

Guice不会注入泽西岛的资源

java

分析了整个互联网,但无法弄清楚为什么会发生这种情况。我有一个最简单的项目(使用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并绑定了我的类,如下所示:

public class TransportModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Transport.class).to(TransportImpl.class);
    }
}

我可以使用喷油器main(),但是在这里并不需要它:

Injector injector = Guice.createInjector(new TransportModule());

顺便说一句,当我尝试这样做时没有问题:

Transport transport = injector.getInstance(Transport.class);

阅读 210

收藏
2020-11-01

共1个答案

小编典典

泽西岛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版本。

2020-11-01