4

我有一个用 RestEasy 实现的 jax-rs 服务,我正在使用 Jboss as7 并用 @Signleton 注释实现了一个signleton ejb。当服务器启动(@startup)时会启动signleton,我想将它注入到使用@EJB的jax-rs中。问题是这个类总是空的,我开始迷路了,因为在我看过的每个教程中,这就是他们注入 ejb 的方式。我应该使用任何特殊的 xml 文件吗?我究竟做错了什么?

@Path("/")
public class Service extends Application{
@EJB
private GlobalStore store;
public Service(){
fromejbstore = store.getSentiment();//null pointer is thrown
}
}

Signleton ejb 是:

@Singleton
@Startup
public class GlobalStore {
 Sentiment sentiment;
 @PostConstruct
public void initialize() {
 //do something
}
public Sentiment getSentiment(){return sentiment;}
}
4

6 回答 6

3

我已将代码更改为如下所示并避免注入:

    `try{
        InitialContext ctx=new InitialContext();
        localRef = (myEjb) ctx.lookup("java:global/appName/EjbName");
       }catch(NamingException ne){
            System.out.println("\n[MyRestService]NamingException: "+ne);
            ne.printStackTrace();
       }`

找不到@EJB 注释不起作用的原因,可能这与RestEasy 有关。

于 2012-04-29T13:58:14.820 回答
3

AFAIK,@EJB 注释注入不适用于 POJO - 尝试将您的 Service 类转换为无状态会话 bean(通过在类级别添加 @Stateless 注释)并且 GlobalStore 注入应该像魅力一样工作

于 2012-08-06T11:58:30.303 回答
1

当我从 Rest 服务调用 EJB 时,我遇到了同样的问题。当我注入@EJB 时我得到了空值。当我尝试在服务类中添加@Stateless 时没有问题。我认为您可以在 Service 类中添加 @Stateless 。那么就没有问题了。

于 2013-09-12T11:18:49.420 回答
0

我认为您以错误的方式激活您的 JAX-RS。一个扩展Application和注释的类@ApplicationPath是 Java EE 6“无 XML”方法来激活 JAX-RS。

@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
 /* class body intentionally left blank */
}

那么你Service应该在同一个包中,JaxRsActivator但不需要扩展Application

@Path("/test")
public class Service
{
  @EJB private GlobalStore store;

  @GET @Path("/test")
  public String getTime()
  {
   boolean test = (store==null);
   return "Test: "+test;
  }
}

您可以使用浏览器对其进行测试http://<host>/<context>/rest/test/test

于 2012-04-27T05:41:34.317 回答
0

上面提供的答案是正确的。将@Stateless 添加到服务,添加服务实现的@Local 注释接口,然后在类中通过将@EJB 添加到该接口的引用来访问该无状态bean。我在 Websphere Liberty Profile 上可能需要做的唯一另一件事是在 WEB-INF 目录中创建 beans.xml 文件以停止该 cdi bean 上的 NPE。

@Stateless
public class ServiceImpl implements Service {
    public void doSomething() {
        System.out.println("I did something");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("I was just constructed");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("Arrgg I am being destroyed");
    }
}

@Local
public interface Service {
    public void doSomething();
}


public class Client {

    @EBJ Service service;

    public void someMethod() {
        service.doSomething();
    }
}

../WEB-INF/beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
  http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

您可以在 bean 上添加 post 构造和 pre destroy 注释方法,以查看它在应用程序启动和关闭时被创建和销毁。

于 2016-07-20T19:04:22.300 回答
-2

在 web-inf 中添加 beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

并更改类扩展应用程序:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/rest")

public class YourApplication extends Application
{
   HashSet<Object> singletons = new HashSet<Object>();

   public YourApplication()
   {
      getClasses().add(yourOwnClass.class);
   }

   @Override
   public Set<Class<?>> getClasses()
   {
      HashSet<Class<?>> set = new HashSet<Class<?>>();
      return set;
   }

    enter code here

   @Override
   public Set<Object> getSingletons()
   {
      return singletons;  
   }
}
于 2013-09-03T15:12:02.933 回答