CDI注入源在Jersey子资源中不可用

时间:2017-03-04 17:42:38

标签: java jersey cdi jersey-2.0 hk2

我在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

1 个答案:

答案 0 :(得分:0)

正如https://java.net/jira/browse/JERSEY-3184所指出的,在子资源类中添加一个虚拟@Path("xyz")是一个" fix"。但是,这会在虚拟路径下公开您的子资源。

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

我发现其他2种方法完全有效(CDI注射和JAX-RS注射)并且没有副作用(与@Path一样):

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

这两种方法似乎都有效,因为它们使泽西岛 - 而反过来,CDI - 意识到了这一类。

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