当前位置: 首页 > 知识库问答 >
问题:

泽西岛的依赖注入 2.17

万俟嘉珍
2023-03-14

我有一个资源类

@Path("/rest")
public class DemoResourceController {
    @Inject
    DemoService demoService;

    @Path("/get/demo")
    @GET
    @Produces(APPLICATION_JSON)
    public Response getDemoLists() {
        List<String> demoList=demoService.getDemoList();
        return  Response.ok(demoList).build();
    }

我尝试了泽西岛2.0的依赖注入中的答案

如果我使用

compile group: "org.glassfish.jersey.ext.cdi" , name: "jersey-cdi1x" , version: "2.17"
compile group: "org.glassfish.jersey.ext.cdi" ,name: "jersey-weld2-se" , version: "2.17"

启动服务器时,我得到

org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: 
Unsatisfied dependencies for type demoService with qualifiers @Default
[BackedAnnotatedField] @Inject  DemoResourceController.demoService at injection point

如果我删除了上述依赖项,那么我得到

javax.servlet.ServletException: A MultiException has 3 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no
   object available for injection at SystemInjecteeImpl(requiredType=DemoService,parent=DemoResourceController,qualifiers={},position=- 1,optional=false,self=false,unqualified=null,1952079126)**
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of DemoResourceController errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on package.DemoResourceController

org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:421)

资源配置类是

public class ApplicationConfig extends ResourceConfig {

  public ApplicationConfig() {
    register(new ApplicationBinder());
    packages(..name of packages..);
  }

活页夹类是

public class ApplicationBinder extends AbstractBinder{
  @Override
  protected void configure() {
      bind(DemoService.class).to(DemoServiceImpl.class);
  }
 }

我在嵌入式模式下使用tomcat并添加init参数

Context ctx = tomcat.addContext("/", new File("web-app").getAbsolutePath());
Wrapper wrapper = ctx.createWrapper();
wrapper.addInitParameter("javax.ws.rs.Application","xx.xx.ApplicationConfig");

我如何在控制器中注入服务?注入是单元测试的首选方式吗(当服务实现调用另一个服务时,比如说XService ),单元测试不应该依赖于Xservice,因此demoServiceImpl如何从测试中将服务的模拟注入控制器?

共有1个答案

颛孙凯定
2023-03-14

在第二次尝试中(没有 cdi 依赖项,使用 HK2),您的绑定不正确。它应该是

bind(Implementation).to(Contract)
// - i.e.
bind(DemoServiceImpl.class).to(DemoService.class);

你反过来了。

至于测试,如果你在同一个包中有测试(在项目的测试区域),你应该能够分配服务,因为它是包私有的。虽然就个人而言,我已经养成了构造函数注入的习惯。你可以做的另一件事是使用Jersey测试框架。您可以在这里看到一个完整的示例,其中注入了一个模拟服务

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

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

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

  • 我很难用泽西岛2(2.7)和泽西岛的内置HK2依赖注入来获得一个非常基本的单例类实现。我正在雄猫上运行这个。 我的目标是创建一个支持类的单例实例,供各种web服务方法使用。在构造函数注入、方法注入和注释类成员之间,我没有强烈的偏好(如下所述)。 这是我的单身班: 这是我的应用程序类: 以下是我的Provider/ContextResolver类: web.xml: 我打算在其中注入 JustOne

  • 问题内容: 分析了整个互联网,但无法弄清楚为什么会发生这种情况。我有一个最简单的项目(使用jersey-quickstart- grizzly2原型),并且只有一个Jersey资源。我将Guice用作DI,因为CDI也不想与Jersey合作。问题在于,Guice在注入Jersey的资源时无法解析要使用的类。它在外面很好用,但不适用于泽西岛。这是泽西岛的资源: 传输接口: 它的实现: 遵循Googl

  • 我不想让泽西做任何依赖注射。我认为有从Jersey到Guice的桥梁,但是基于我不能在这里显示的程序需求,我需要自己创建REST控制器实例,并向Guice请求它们。 我的问题:我怎样才能禁用泽西岛的依赖注入? 我当前正在使用注释。也许我可以改用注释,以为Jersey不会在寻找这些注释。但我还是宁愿把泽西岛的依赖注射关了。我怎么能那样做?