当前位置: 首页 > 面试题库 >

Guice不会注入泽西岛的资源

水麒
2023-03-14
问题内容

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

问题答案:

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

也可以看看:

  • 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版本。



 类似资料:
  • 我决定在这部分替换Web.XML: 我指向servlet容器Jersey,它将接受对REST-Controllers的请求,表明在启动时有必要扫描路径com . skillsimprover . REST examples . REST上的包REST,并表明资源的所有方法和类的基URI都填充了/api/* 从 JAX-RS 2.x 版本开始,可以使用应用程序类或资源配置类来注册包和资源。 我执行了

  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 我有一个资源类 我尝试了泽西岛2.0的依赖注入中的答案 如果我使用 启动服务器时,我得到 如果我删除了上述依赖项,那么我得到 资源配置类是 活页夹类是 我在嵌入式模式下使用tomcat并添加init参数 我如何在控制器中注入服务?注入是单元测试的首选方式吗(当服务实现调用另一个服务时,比如说XService ),单元测试不应该依赖于Xservice,因此demoServiceImpl如何从测试中将

  • 问题内容: 我的问题是:为什么在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别? 我需要将Jersey与Guice集成在一起。是否需要注册Guice的存在才能以某种方式使用它?我是否可以仅启用注入并在我想要的任何地方(常规类,过滤器,处理程序,服务,DAO等)

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?