【问题标题】:Cant inject Bean class into Restfull WebService (JAX-RS) [duplicate]无法将 Bean 类注入 Restful Web 服务(JAX-RS)[重复]
【发布时间】:2013-06-04 09:48:24
【问题描述】:

我正在尝试使用休眠/持久性将 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]

【问题讨论】:

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


    【解决方案1】:

    @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 REST 和 CDI 的文档 here 应该可以开箱即用。如果你指定 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 上推送了一个工作示例

    【讨论】:

    • 好吧,我之前尝试过,将注释从 EJB 更改为 Inject 没有任何改变,调用 pb.addDevice(d) 时仍然是空指针;
    • 你确定你的对象被注入了吗?你把 CDI beans.xml 文件放在哪里了?
    • 也许这是我没有任何 beans.xml 文件的问题
    • 当然,你需要它在 WEB-INF 的 WAR 模块或 META-INF 的 jar(ejb 或 lib)模块。见docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html
    • 好的,我创建了 beans.xml 网络模块,代码:&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;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"&gt; &lt;/beans&gt; 但没有帮助
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我有类似的问题,对我来说,问题是我自己使用构造函数创建我的 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 {
      }
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        • 1970-01-01
        • 2013-06-26
        相关资源
        最近更新 更多