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

泽西子资源中没有CDI注入源

贺兴平
2023-03-14

我正在泽西岛应用程序中使用 CDI。在根资源上,CDI 注入按预期工作,但每当我返回子资源时,CDI 注入源都不可用。

具有子资源定位器的根资源:

@Path("")
public class MyResource {

    @Inject @Named("name") // works
    private String name;

    @Context
    private ResourceContext context;

    @Path("test2")
    public Object test2() {
        return MySubResource.class;
        //return context.getResource(MySubResource.class); // this does not work either
    }

}

子资源:

public class MySubResource {

    @Inject @Named("name") // error
    private String name;

    @GET
    public Response test() {
        return Response.ok("Name in sub resource: " + name).build();
    }

}

错误:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=String,parent=MySubResource,qualifiers={@javax.inject.Named(value=name)},position=-1,optional=false,self=false,unqualified=null,1235803160)

我正在使用org.glassfish.jersey.ext.cdi: jersey-cdi1x和Weld依赖项,在Undertow上运行,并将Weld servlet侦听器添加到部署中。

同样,对根资源的相同注入确实有效。< code>@Named("name ")字符串由< code>@ApplicationScoped生成器生成。

这不应该有效吗?我错过了什么?

此处提供最小的 Maven 项目示例:https://gitlab.com/Victor8321/jersey-sub-resource-cdi

注意:这方面存在一个公开问题,但不确定官方对此的立场是什么:https://java.net/jira/browse/JERSEY-3184

共有1个答案

有品
2023-03-14

正如https://github.com/eclipse-ee4j/jersey/issues/3456,所指出的,向子资源类添加一个伪< code>@Path("xyz")是一种“修复”。然而,这暴露了虚拟路径下的子资源。

仅通过 CDI 注入实例也有效(@Inject实例

我发现了另外两种完全有效的方法(CDI注入和JAX-RS注入),并且没有副作用(如@Path):

  • 使用@Provider注释子资源类。
  • 注册() 资源配置(或应用程序)中的子资源类。

这两种方法似乎都有效,因为它们让Jersey -进而让CDI -知道这个类。

注意:我已经相应地更新了我的示例项目,以供将来参考。

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

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

  • 我有一个奇怪的问题,我完全不明白,泽西岛2.6。 我无法解释为什么,但其中一个查询参数使泽西岛抛出模型验证异常 查询参数“一些价值”使球衣投掷: 如果我用String代替SomeValueDTO,一切都没问题。SomeValueDTO是一个非常经典的POJO,带有一个空的构造函数和getter/setter。 如果有人有伊迪亚!!

  • 免责声明:我刚刚开始使用OSGI,所以请忍受我和我的知识不足... 为了本练习,假设我有一个基于泽西岛 (2.17.0) 的 REST 应用程序在 OSGI 环境中的 Jetty (9.2.10) 下运行,它为用户提供了一些通过 SOAP 从单独的服务器收集的统计信息。 我现在尝试在另一个应用程序中重用一些现有代码,该应用程序应该通过JMS(或其他东西)检索统计信息。 我的目的是在捆绑包中为客户端

  • 我正在使用Jersey创建RESTful API。我想通过Accept头实现版本控制。我的资源(例如MyResourceV1、MyResourceV2和SubresourceV1、SubresourceV2)被分为不同的类。现在,我使用的是内容类型

  • 在Spring中,我们有基于注释和基于XML的配置。虽然第一种配置被推荐用于快速开发,但第二种配置更加灵活,能够处理特殊情况。我们目前有两种配置:为JUnit测试注入模拟和从外部库配置bean。 我还没有为CDI的XML配置找到任何等价物,所以我的问题是,如何处理这种bean的依赖注入?它们来自外部库,需要进行配置,不可能向它们添加任何注释。