我正在使用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不能完成它的工作。那是正确的吗?
我找到的唯一合适的解决方案是创建自己的注释和注入提供程序。
@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清单看起来像这样: 但我也需要将我们的“资源”文件夹添加到这个类路径中: