虽然Web上已经存在很多StackOverflow问题,博客条目等,但我仍然无法找到解决下述问题的方法。
与此问题(Injecting EJB within JAX-RS resource on JBoss7)类似,我想将EJB实例注入JAX-RS类。我试过JBoss 5,JBoss 7和WildFly 8.我要么根本没有注入(字段为空),要么服务器没有部署(一旦我尝试组合各种注释)。
将@Stateless
添加到JAX-RS会使应用程序服务器将这两个类都知道为bean。但是,没有注射。
有没有办法将EJB注入REST应用程序?我可以提供什么样的信息(除了上面提到的问题中包含的信息)?
编辑:我创建了一个Github项目,显示可以使用的代码(使用Glassfish 4.0)但不起作用(使用JBoss 5)。
https://github.com/C-Otto/beantest
EDIT2: 在Glassfish 4.0上运行我在JBoss 5上试过的代码给出了:
Exception while loading the app : CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Ref<ContainerRequest>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.server.internal.routing.UriRoutingContext(Ref<ContainerRequest>, ProcessingProviders)]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Ref<ContainerRequest>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject org.glassfish.jersey.server.internal.routing.UriRoutingContext(Ref<ContainerRequest>, ProcessingProviders)]
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:403)
EDIT3:关键信息可能是我喜欢适用于JBoss 5的解决方案
答案 0 :(得分:2)
如果你不想让你的JAX-RS资源成为EJB(@Stateless
),然后使用@EJB
或@Resource
来注入它,你可以随时使用JNDI lookup(我倾向于编写一个“ServiceLocator”类,通过它的类获取服务。
阅读有关该主题的不错资源:
示例代码:
try {
// 1. Retreive the Home Interface using a JNDI Lookup
// Retrieve the initial context for JNDI. // No properties needed when local
Context context = new InitialContext();
// Retrieve the home interface using a JNDI lookup using
// the java:comp/env bean environment variable // specified in web.xml
helloHome = (HelloLocalHome) context.lookup("java:comp/env/ejb/HelloBean");
//2. Narrow the returned object to be an HelloHome object. // Since the client is local, cast it to the correct object type.
//3. Create the local Hello bean instance, return the reference
hello = (HelloLocal)helloHome.create();
} catch(NamingException e) {
} catch(CreateException e) {
}
这不是“注入”本身,但你也不要使用“new”,你让应用服务器给你一个被管理的实例。
我希望这很有用,我不会告诉你一些你已经知道的事情!
修改强>
这是一个很好的例子:https://docs.jboss.org/author/display/AS72/EJB+invocations+from+a+remote+client+using+JNDI
编辑2:
正如您在评论中所说,您希望通过注释注入它。
如果JNDI查找当前正在为您工作而没有问题,并且
如果您使用的是Java EE 6+(我猜你是),您可以执行以下操作:
@EJB(lookup = "jndi-lookup-string-here")
private RemoteInterface bean;