Jersey:如何将EJB注入子资源?

4

我希望在一个由子资源定位器定义并提供的子资源中注入一个业务服务bean。

以下是一些示例代码:

  1. A root resource

    @RequestScoped
    @Path("service")
    public class MyResource {
    
        @Context
        ResourceContext resourceContext;
    
        // Sub resource locator
        @Path("subservice")
        public MySubResource locateToSubResource () {
            // I don't want to create it myself.
            return resourceContext.getResource(MySubResource.class);
        }
    }
    
  2. The corresponding sub resource

    @RequestScoped
    public class MySubResource {
    
        // Note that businessBean itself consists of
        // multiple ejbs that also need to be injected so that it can do its job!
        @Inject
        private BusinessBean businessBean; 
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String get () {
            return businessBean.doStuff();
        }
    }
    
Jersey不会让CDI调用依赖项...请注意,资源是受管理的对象。否则,在根资源中注入bean甚至都不可能(这里我正在推动我的其他问题的浏览量以获得更多意见;-))! 我尝试了我能想到的一切,但它就是不起作用... 目前我正在使用随GlassFish 4一起提供的库。当然,提前谢谢你(几乎忘了)!
2个回答

7

好的,我想通了。

这真的有点愚蠢。有时你必须完全回退。

我的初始尝试肯定有些问题(拼写错误,漏掉了什么...我无法重现它,无论如何)。

我稍微改变了根目录资源:

@RequestScoped
@Path("service")
public class MyResource {

    @Inject MySubResource mySubResource;

    // Sub resource locator
    @Path("subservice")
    public MySubResource locateToSubResource () {
        return mySubResource;
    }
}

是的,就是这样。我必须承认,这是最直观的解决方案,如果这种方法不起作用,那么一定是做错了什么...不要问我具体原因是什么。
我想这就像往常一样——睡眠不足会让人变成白痴。

这对我来说终于起作用了,但是我有一个问题:在根资源类上是否真正需要@RequestScoped?如果没有它,也可以工作,我认为你不需要将CDI bean注入到另一个bean中,但它也适用于JAX-RS资源类(例如)吗? - Hein Blöd
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Hein Blöd

2
我是这样解决的。
public SubResource subResource() {
    return CDI.current().select(SubResource.class).get();
}

2
嗯,也许有某些使用情况是适用/可接受的,但任何可能的错误都只会在实际执行运行时时显现出来,对吧?如果您改为使用声明式的@Inject方式,注入提供程序至少有机会在部署期间及早抱怨。另一方面,您的答案展示了一个很好知道的编程替代方案,这使它非常有用。 - Doe Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接