【问题标题】:CDI injection source not available in Jersey sub-resourceJersey 子资源中不提供 CDI 注入源
【发布时间】:2017-03-04 17:42:38
【问题描述】:

我在 Jersey 应用程序中使用 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 侦听器添加到部署中。

同样,根资源上的相同注入确实有效。 @Named("name") String@ApplicationScoped 生产者制作。

这不应该工作吗?我错过了什么?

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

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

【问题讨论】:

  • 我没有尝试过你的 CDI 项目,但如果它不起作用,那么可能是 CDI 的问题,因为它works with HK2。我从来没有真正将 CDI 与 Jersey 一起使用,所以我不确定 CDI 是否仍然通过 HK2,因为错误是从 HK2 抛出的。如果CDI不通过HK2,那么我猜子资源不通过CDI(因为错误是HK2错误),这就是问题所在。
  • 您使用的是哪个 CDI? GlassFish、WebLogic 还是其他?
  • 你尝试注入你的子资源了吗?在那里返回课程将不起作用。
  • 我很确定它有效;也看到了一些关于询问子资源的问题 - stackoverflow.com/questions/42504072
  • 那个问题使用return context.getResource(SubResource.class);而不是return SubResource.class;

标签: java jersey cdi jersey-2.0 hk2


【解决方案1】:

正如https://github.com/eclipse-ee4j/jersey/issues/3456 中所指出的,将虚拟@Path("xyz") 添加到子资源类是一种“修复”。但是,这会将您的子资源暴露在虚拟路径下。

仅通过 CDI 注入实例也可以 (@Inject Instance<MySubResource> ..),但随后 Jersey 管理的资源不可用于注入,例如 @Context HttpServletRequest

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

  • @Provider注释子资源类。
  • register()ResourceConfig(或Application)中的子资源类。

这两种方法似乎都有效,因为它们让 Jersey - 反过来,CDI - 知道类。

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

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2011-12-20
    • 2014-04-23
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多