当前位置: 首页 > 知识库问答 >
问题:

当通过ResourceContext获得子资源时,将EJB注入到JAX-RS2.0子资源中

马阳晖
2023-03-14

我正在使用Jersey 2.8和Glassfish 4.0。我有一个资源定位器类,如下所示

@Path("/")
@ManagedBean
public class MyServiceLocator {
    @Context
    ResourceContext rc;//javax.ws.rs.container.ResourceContext

    @EJB
    private MyEJBHome myEJB;

    @Inject//javax.inject.Inject
    MySubService mss;

    @Path("/mysubservice")
    public MySubService getMySubService() {
    return rc.getResource(MySubService.class);
    //also tried return rc.initResource(new MySubService());
    }
}
@ManagedBean
public class MySubService {

    @EJB
    public MyEJBHome myEJB;

    @Context
    HttpHeaders heads;

    /*@Inject
    private myEJBHome myEJB2;*/

    @Path("/mypath")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Object doSomething(@Context SecurityContext securityContext) {...}
}

问题是,当通过ResourceContext获得MySubService时,EJB没有注入其中。

以前,我使用Glassfish 3和Jersey 1.17以及专有的ResourceContext,完全相同的代码可以正常工作。

我在谷歌上搜索了很多,读到了很多类似(但有点不同)的问题,据我所知,当通过ResorceContext获得子资源时,不能注入非JAX-RS的东西(在我的例子中是EJB)。真的吗?如果是的话,我该怎么处理呢?一个可能的解决方案是将子资源对象注入到资源定位器类中,但是子资源对象太多了,看起来很难看。

设置@named注释和尝试通过CDI注入的不同操作都没有帮助。看起来,当通过ResourceContext获取子资源时,Jersey只使用HK2,这就是为什么CDI不能完成它的工作。那是正确的吗?

共有1个答案

燕野
2023-03-14

我找到的唯一合适的解决方案是创建自己的注释和注入提供程序。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EJBInject {
    String beanName();
}

@Provider
public class EjbInjectProvider implements InjectionResolver<EJBInject> {

    @Override
    public Object resolve(Injectee injectee, ServiceHandle<?> handle) {

        try {
            String beanName = injectee.getParent().getAnnotation(EJBInject.class).beanName();
            return new InitialContext().lookup("java:global/MyApp/" + beanName);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public boolean isConstructorParameterIndicator() {
        return false;
    }

    @Override
    public boolean isMethodParameterIndicator() {
        return false;
    }
}

则可以使用该注释注入ejb,如

@EJBInject(beanname=“MyBean”)MyBeanEJBHome MyBean;

在这种情况下,MyBeanEJBHome可能需要的任何标准EJB注入也可以正常工作。

 类似资料:
  • 报表子资源 我使用Java EE7和Glassfish和WAS Liberty配置文件的经验是,没有注入ReportService rs实例,使rs为空并导致NPE。 我的假设是,因为resource类正在执行“new ReportsResource()”,所以CDI对ReportsResource实例没有可见性,因此ReportsResource不是容器管理的。这似乎与这个问题相同,当通过Res

  • 我正在泽西岛应用程序中使用 CDI。在根资源上,CDI 注入按预期工作,但每当我返回子资源时,CDI 注入源都不可用。 具有子资源定位器的根资源: 子资源: 错误: 我正在使用和Weld依赖项,在Undertow上运行,并将Weld servlet侦听器添加到部署中。 同样,对根资源的相同注入确实有效。< code>@Named("name ")字符串由< code>@ApplicationSco

  • 本章呈现 JAX-RS 核心概念-资源和子资源的概述。 JAX-RS 2.0 的 JavaDoc 文档 可以在这里 找到。 JAX-RS 2.0 规范草案可以在这里 找到。

  • 我需要编写一个无状态会话bean,并将其部署到WLS10.3。3.会话bean应该能够向通过WLS控制台创建的已知JMS队列发送文本消息。因此,我编写了以下代码: 我现在需要做的是提供一个有效的weblogic-ejb-jar.xml与资源参考到jndi-name映射。有人能为weblogic-ejb-jar.xml提供一个例子吗? jmsConnectionFactory应该绑定到jndi-na

  • 前面的章节中已经给出注释类型的例子,主要用标注方法参数,也可以通过对类的域进行注解将值注入到这些类型。 本节介绍了在注释类型上注入值的规则。注入可以用在属性,构造函数参数,资源/子资源/子资源定位方法的参数和 bean setter方法。以下介绍的这些注入的情况下: Example 3.23. 注入 @Path("{id:\d+}") public class InjectedResource {

  • 我们的EAR中有一个资源文件夹,这个文件夹包含一些图像,xml和文本文件。我需要将此文件夹添加到我们的 EJB 清单类路径中。 目前,我的maven ear插件添加了我们的*。jar到我的EJB jar类路径,例如,我们的ejb.jar清单看起来像这样: 但我也需要将我们的“资源”文件夹添加到这个类路径中: