【问题标题】:Jersey: How to inject EJB into sub resource?Jersey:如何将 EJB 注入子资源?
【发布时间】:2014-02-20 12:34:31
【问题描述】:

我想在子资源中注入一个业务服务 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();
        }
    }
    

Jersey 不会让 CDI 调用依赖项...请注意,资源是托管对象。否则甚至无法在根资源中注入 bean (here I'm pushing my other questions' view count to get more opinions ;-))!

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

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

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

【问题讨论】:

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


    【解决方案1】:

    好的,我想通了。

    真的有点傻。有时您必须完全回滚。

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

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

    @RequestScoped
    @Path("service")
    public class MyResource {
    
        @Inject MySubResource mySubResource;
    
        // Sub resource locator
        @Path("subservice")
        public MySubResource locateToSubResource () {
            return mySubResource;
        }
    }
    

    是的,就是这样。我必须承认,这是人们能想象到的最直观的解决方案,如果这种方法不起作用,那一定是做错了什么……不要问我到底是什么原因。

    我想这和往常一样——剥夺睡眠会让人们变成白痴。

    【讨论】:

    • 这终于对我有用了,但我有一个问题:根资源类真的需要@RequestScoped吗?如果没有它,它也适用于我,我认为您不需要 CDI bean 来注入另一个,但它也适用于 JAX-RS 资源类(例如)?
    • 实际上,似乎甚至不必在子资源上使用明确的@RequestScoped,因为根据this的答案,默认范围应该与类相同接受注射?事实上,我也可以省略那个注释。
    【解决方案2】:

    我是这样解决的。

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

    【讨论】:

    • 嗯,也许在某些用例中这是适用/可接受的,但任何可能的错误直到实际执行在运行时才会显现,对吧?如果您改用声明式@Inject-方式,注入提供者至少有机会在部署期间急切地抱怨。另一方面,您的答案显示了一个很好的知识的程序替代方案,使其有用。 span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2010-10-15
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多