在JBoss 5中的JAX-RS资源中注入EJB

时间:2014-02-27 16:48:15

标签: rest jboss ejb jax-rs jboss5.x

虽然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

  • 使用Glassfish提交4bf2f3d23f49d106a435f068ed9b30701bbedc9d 4.0。
  • 提交50d137674e55e1ceb512fe0029b9555ff7c2ec21使用Jersey 1.8,但不起作用。
  • 提交86004b7fb6263d66bda7dd302f2d2a714ff3b939 使用Jersey 2.6,它也不起作用。

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的解决方案

1 个答案:

答案 0 :(得分:2)

如果你不想让你的JAX-RS资源成为EJB(@Stateless),然后使用@EJB@Resource来注入它,你可以随时使用JNDI lookup(我倾向于编写一个“ServiceLocator”类,通过它的类获取服务。

阅读有关该主题的不错资源:

https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project

示例代码:

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;