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

时间:2014-01-28 22:53:47

标签: dependency-injection ejb jax-rs jersey-2.0

我想在子资源中注入一个商务服务bean,该子资源在专用类中定义并由子资源定位器提供。

一些示例代码:

  1. 根资源

    @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. 相应的子资源

    @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();
        }
    }
    
  3. Jersey不会让CDI调用依赖项...请注意,资源是托管对象。否则甚至不可能在根资源(here I'm pushing my other questions' view count to get more opinions ;-))中注入bean!

    我尝试了所有我能想到的东西,但它不起作用......

    目前我正在使用glassfish 4附带的库。

    当然,先谢谢你(差点忘了)!

2 个答案:

答案 0 :(得分:7)

好的,我明白了。

这真是一种愚蠢。有时你必须完全回滚。

我最初的尝试肯定有问题(拼写错误,遗漏了一些东西......我无法重现它,无论如何)。

我稍微改变了上面的根资源:

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

    @Inject MySubResource mySubResource;

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

是的,就是这样。我必须承认,这是人们可以想象的最直观的解决方案,如果这种方法不起作用,就必须做错事......不要问我究竟是什么原因。

我想它一如既往 - 睡眠剥夺让人们变成了白痴。

答案 1 :(得分:2)

我这样解决了。

public SubResource subResource() {
    return CDI.current().select(SubResource.class).get();
}