java - 无法将 Bean 类注入(inject) Restful Web 服务 (JAX-RS)

标签 java jakarta-ee ejb persistence jax-rs

我正在尝试使用 hibernate/persistence 将 Rest Web 服务获取的数据保存到数据库中。 在我的一个网络模块中,我实现了该服务。数据库ejb连接器放置在EJB模块中。它们是 EAR 应用程序的一部分。 每次当我调用 pb.addDevice() 时,在浏览器中输入带有参数的正确 url 时,我都会收到 java.lang.NullPointerException(直到我想将其保存到数据库为止)。找不到它有什么问题。我正在使用 jboss 6.1.0 Final。

尝试过Dependency injection in restful WS的答案

一步一步遵循后,我也得到了空指针

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();
}

}

更新:

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]

最佳答案

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

为此,您需要使用 CDI,因此请替换 @EJB@Inject并且您的 Bean 将被正确注入(inject)。

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

编辑:

另外请务必添加beans.xml到每个包含您想要注入(inject)或被注入(inject)的类的 jar/war 存档。它进入 META-INF用于 jar 和 WEB-INF为了 war 。

您的 REST 应用程序类 packaget.Rest应该延长javax.ws.rs.core.Application如:

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

根据文档 here在 JBoss 6.1 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 上推送了一个工作示例

关于java - 无法将 Bean 类注入(inject) Restful Web 服务 (JAX-RS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914671/

相关文章:

java - 命名内容存储库中的节点

java - jaxWS "client"需要一种方法来跟踪原始 xml 请求和响应

java - 在 OS X Lion 上安装 Java EE 6

javax.ejb.EJBException : javax. ejb.CreateException:无法创建无状态 EJB junit

java - 从一系列随机字母中找到单词?

java - JPA 乐观锁定规范是否支持根据客户端提供的版本进行验证

Java 正则表达式 : extract function names

java - 无法通过 Apache POI 3.6 检索数字格式和类别为货币的 Excel 单元格值

java - 错误 [stderr](EJB 默认值 - 8)java.lang.ClassNotFoundException : org. sqlite.JDBC

java - 来自不同持久单元的 JPA 实体映射