无法将Bean类注入Restful Web Service(JAX-RS)

时间:2013-06-04 09:48:25

标签: java java-ee ejb persistence jax-rs

我正在尝试使用休眠/持久性将Rest Web服务获取的数据保存到数据库。 在我的一个Web模块中,我实现了该服务。 Database ejb连接器放在EJB模块中。它们是EAR应用程序的一部分。 每当我调用pb.addDevice()时,在浏览器中放入带有params的正确url时,我会得到java.lang.NullPointerException(直到我想将它保存到数据库)。找不到它有什么问题。我正在使用jboss 6.1.0 Final。

尝试回答Dependency injection in restful WS

并且在逐步跟随它之后也会获得nullpointer

PS。当我从

改变
@EJB
PersistenceBean pb; 

PersistenceBean pb = new PersistenceBean();

我在EntityManager上有空指针em = emf.createEntityManager();

代码:

@Stateless
@Path("/RestService")
public class RestPush  {

@EJB
PersistenceBean pb; 

    @GET
    @Path("/RegisterDevice")
    public void registerDevice(
        @QueryParam("deviceId") String deviceId){

        Device d = new Device(true);
        d.setId = deviceId;
        pb.addDevice(d);
    }
}

和EJB类:

@Stateless(mappedName = "PersistenceBean")
public class PersistenceBean {
@PersistenceUnit(unitName = "PersistentUnitName")
EntityManagerFactory emf;

private void persist(Object o, EntityManager entityManager) {
    try {
        entityManager.persist(o);
    } catch (Exception e) {
        logger.severe("Error writing to DB: " + e);
        logger.severe("" + e.fillInStackTrace());
    }
}
  public void addDevice(Device d) {
    try {
        EntityManager em = emf.createEntityManager(); 
    if (persist(device, em)) {
            logger.info("Device with id : " + device.getId()
                    + " has been added ");
} else {
            logger.info("Failed to add device with id: " + device.getId());
} catch (Exception e) {
        logger.severe("PersistenceBean: Could not save device.");
        e.printStackTrace();
}

}

upadate:

EAR
  --EarContent
    --META-INF
       --application.xml
EJB
  --package in ejbModule
    --PersistenceBean
    --Device
  --META-INF
    --ejb-jar.xml
    --MANIFEST.MF
    --persistence.xml
    --beans.xml

Web
  --package in webModule
    --Rest (auto generated class while creating Webservice)
    --RestPush
  --WebContent
    --META-INF
      --MANIFEST.MF
    --WEB-INF
      --web.xml
      --beans.xml

堆栈跟踪:

`10:23:28,629 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/RestWeb].[Resteasy]] Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
at 
Caused by: java.lang.NullPointerException
at package.RestPush.registerDevice(RestPush.java:68) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_27]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_27]

3 个答案:

答案 0 :(得分:2)

@EJB注释不适用于所有对象。

为此,您需要使用CDI,因此将@EJB替换为@Inject,您的bean将被正确注入。

另请参阅:Inject an EJB into JAX-RS (RESTful service)

编辑:

还要确保将beans.xml添加到包含要注入或注入的类的每个jar / war存档中。对于罐子,它会进入META-INF,对于战争会进入WEB-INF

您的REST应用程序类packaget.Rest应该扩展javax.ws.rs.core.Application,如下所示:

@ApplicationPath("/root-path") 
public class Rest extends Application 
{ 
}

根据JBoss 6.1上的文档here,REST和CDI应该开箱即用。如果你指定了org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher和org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap,你可能会搞乱RestEasy / CDI类加载。

因此,您的web.xml应该看起来像:

<web-app version="3.0" 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 java.sun.com/xml/ns/javaee/…"> 
</web-app> 

无论如何,我在github

上推了一个工作示例

答案 1 :(得分:1)

您应该添加/src/main/resources/META-INF/beans.xml。这将启用注射。

答案 2 :(得分:1)

我有类似的问题,对我来说问题是我自己用构造函数创建我的RESTful bean,这在使用EJB和@EJB注入时是愚蠢的:

问题:

@ApplicationPath("/")
public class RestApplication extends Application {
    private Set<Object> singletons = new HashSet<Object>();
    public RestApplication() {
        singletons.add(new RestService());
    }
    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

解决方案:

@ApplicationPath("/")
public class RestApplication extends Application {
}

希望它可以节省某人的时间。