【问题标题】:Injected service keeps throwing NullPointerException注入的服务不断抛出 NullPointerException
【发布时间】:2013-03-31 15:44:48
【问题描述】:

当访问注入的服务时,如下test() 抛出一个NullPointerException
如果我不注入但使用BugService 的新实例,则NPE 将在下一步抛出:BugServicegetItems()
实际上,我发现很难理解 JEE6-Tutorial 关于 CDI 的部分,所以我想我错过了一些非常基本的东西。感谢您的帮助。

这是 Java 类:

package hoho.misc;

import java.io.Serializable;
import javax.inject.Inject;
import javax.inject.Named;
import hoho.service.BugService;

@Named
public class Printer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    BugService bs;

    public static void main(String[] args) {
        Printer lPrinter = new Printer();
        System.out.println(lPrinter.test());
    }

    public String test(){
        String result = bs.getItems().toString();
        return result;
    }
}

以及注入的服务:

package hoho.service;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import hoho.model.generated.Item;

/**
 * Session Bean implementation class ItemService
 */
@Stateless
public class BugService {

   /**
    * Default constructor.
    */
   public BugService() {
   }

   @PersistenceContext
   EntityManager em;

   @SuppressWarnings("unchecked")
   public List<Item> getItems() {
      return this.em.createQuery(
              "SELECT i FROM Item i")
              .getResultList();
   }   
}

我的 jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <exclusions>
      <module name="org.jboss.resteasy.resteasy-atom-provider" />
      <module name="org.jboss.resteasy.resteasy-cdi" />
      <module name="org.jboss.resteasy.resteasy-jaxrs" />
      <module name="org.jboss.resteasy.resteasy-jaxb-provider" />
      <module name="org.jboss.resteasy.resteasy-jackson-provider" />
      <module name="org.jboss.resteasy.resteasy-jsapi" />
      <module name="org.jboss.resteasy.resteasy-multipart-provider" />
      <module name="org.jboss.resteasy.async-http-servlet-30" />
      <module name="org.apache.log4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

<!-- 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
        <deployment>
                 <exclusions>
                        <module name="org.jboss.as.jaxrs"/>
                 </exclusions>
        </deployment>
</jboss-deployment-structure>
 -->

这是我的 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://docs.jboss.org/cdi/beans_1_0.xsd">

</beans>

【问题讨论】:

  • 如果手动实例化 EJB 将无法工作,因为此时它不再是托管对象而是 POJO。您是否将 ejb-jar.xml 打包在 EJB jar 文件的 META-INF 目录中?还有你用的是什么应用服务器?
  • 感谢您的评论。不,我根本没有ejb-jar.xml,这不是EJB 3.1 的可选吗? (哦 **** 我错过了 java-ee6 标签 - 抱歉!)我使用的是 JBoss AS 7.1.1。
  • beans.xml 怎么样?您的部署结构是什么?
  • @LightGuard 我添加了请求的文件。谢谢。
  • 抱歉,我是说战争还是耳朵?还有你的 bean.xml 文件在哪里?

标签: mysql jakarta-ee jboss7.x java-ee-6 cdi


【解决方案1】:

除非 JBOSS 中的某些东西与我使用的 java-ee 容器(glassfish)相比有根本不同,否则您不应该尝试使用自制的 main-method 访问 bean(因为容器不会起作用)。

一种选择是将命名的 bean 绑定到某个 jsf 页面并使用按钮调用 test()。

<h:form>
    <h:commandButton action="#{printer.test}" value="Add"/>
</h:form>

我喜欢this tutorial on jsf-cdi-ejb

【讨论】:

  • 啊,我想你击中了阿克塞尔,我错过了。 CDI 是一种容器管理技术。您不能使用 new 并期望一切都为您连接好。
  • @Aksel 谢谢你的回答。我在BugService 的行中得到NPE,代码为return this.em.createQuery(。我将研究指定的教程并提供一些反馈,它如何帮助/没有帮助解决我的问题。
  • 这意味着 EntityManager 的注入没有发生。部署时服务器日志中可能有一些内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多