【问题标题】:EJB - NullpointerException while injecting beanEJB - 注入 bean 时出现 NullpointerException
【发布时间】:2015-04-16 17:45:26
【问题描述】:

我是 EJB 和 CDI 的新手。 请帮助我理解我在这里做错了什么:

我的代码如下,并部署在 JBoss WildFly 8 上的 WAR 中:

@Stateless(name = "application.listDao")
public class ListDao extends BaseDao {

    @Inject
    private SomeOtherDao someOtherDao;

    // some other methods

}

@Stateless
public abstract class BaseDao {

    @Inject
    protected EntityManager entityManager;

    public List find( long id ) {

        List list = new ArrayList<>();

        // JPA stuff to perform operations

        return list;
    }

}

现在,我将这个 ListDao 注入到部署在同一个 Wildfly 实例上的其他 WAR 中:

@RequestScoped
public class ListReport {

    @Inject
    private ListDao listDao;

    public List getReport(long id) {

        // Here I am getting NullPointerException
        List reportList = listDao.find(id);

        return reportList;
    }

}

我将 listDao 设为 null,因此得到 NullPointerException。 通过在 WEB-INF 文件夹下放置空 beans.xml 来启用 CDI。

【问题讨论】:

  • 尝试注入接口类型而不是类类型。看这里stackoverflow.com/questions/16056881/…
  • 使用@PersistenceContext 注入EntityManager 而不是@Inject
  • 战争是在同一只耳朵里吗?
  • 另外,我认为没有理由让您的 DAO EJB 管理。去掉@Stateless注解,或许能解决你的问题。

标签: java jakarta-ee ejb cdi wildfly


【解决方案1】:

正如其中一个 cmets 中提到的,你是 @Inject'ing 你的 EntityManager,但是你没有提供任何证据证明你有一个制作人。 EntityManager没有默认生产者方法

【讨论】:

  • 好的,我正在删除 entitymanager 的东西,只是忽略了 JPA 操作。但是注入的 ListDao 仍然为空
  • 也许您可以提供完整的堆栈跟踪。
【解决方案2】:

如果另一场战争不在同一个 EAR(企业档案)中,这是不可能的。这是两个完全独立的部署。由于类加载器隔离,这两个部署甚至看不到彼此的类。 在这种情况下,您需要将两场战争打包到一只耳朵中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2021-08-04
  • 2015-01-11
  • 2019-02-21
  • 2012-05-12
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多