【问题标题】:JAX-RS @EJB injection gives NullPointerExceptionJAX-RS @EJB 注入给出 NullPointerException
【发布时间】:2019-02-21 11:43:08
【问题描述】:

我正在尝试部署一个战争文件以在 WildFly Swarm 上运行。在执行 GET 请求时,会发生 NullPointerException,因为注入失败并且引用显然为 null。

SomeDao.java

import java.util.List;
import java.util.UUID;

import javax.ejb.Local;

@Local
public interface SomeDao {
    public List<MyEntity> listAll();
    public void store(MyEntity entity);
}

SpecializedDao.java

import java.util.List;
import java.util.UUID;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class SpecializedDao implements SomeDao {
    @PersistenceContext(unitName="primary")
    protected EntityManager entityManager;

    public SpecializedDao() {}

    @Override
    public List<MyEntity> listAll() {
        return this.entityManager
                .createQuery("SELECT entity FROM MyEntity entity", MyEntity.class)
                .getResultList();
    }

    @Override
    public void store(MyEntity entity) {
        entityManager.getTransaction().begin();
        entityManager.persist(entity);
        entityManager.getTransaction().commit();
    }
}

然后,我需要注入一个 SpecializedDao 实例的端点。

MyEndpoint.java

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Stateless
@Path("/something")
public class MyEndpoint {

    @EJB
    private SomeDao dao;

    @GET
    @Path("/test")
    @Produces({MediaType.APPLICATION_JSON})
    public Response test() {
        MyEntity testEntity = new MyEntity("something", "something");

        dao.store(testEntity);

        return Response.ok("All done!").build();
    }


}

beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="annotated">
</beans>

NullPointerException 在 dao.store(testEntity) 处启动,因为 dao 引用了一个空对象。我很确定 persistence.xml 文件是正确的,因为 EntityManager 在另一个测试用例上工作,所以我认为问题在于注入。

我哪里做错了?

【问题讨论】:

    标签: jax-rs ejb wildfly


    【解决方案1】:

    你是不是忘了放一个“beans.xml”文件(在WEB-INF/META-INF文件夹下)?

    【讨论】:

    • 我已经放过了...为了完成代码,我在第一篇文章中添加了它
    【解决方案2】:

    您可以检查的其他事项。

    1. 您的 beans.xml 是否位于正确的文件夹中(即在 webapp/war 的情况下位于 WEB-INF 中)?
    2. 您是否包含了 Swarm CDI 部分/依赖项 (org.wildfly.swarm:cdi)?
    3. 我不是 Swarm 专家,但可能只有在使用 java.inject.@Inject(而不是使用 @EJB)的“à la JSR-299”注入 bean 时,CDI 部分才有效。

          @Inject
          private SomeDao dao;
      
    4. 最终:尝试在 beans.xml 中使用 bean-discovery-mode="all"(...即使“注释”似乎是正确的)

    【讨论】:

    • 好的,所以,已经取得了一些进展,谢谢!我添加了 CDI 依赖项(我以为我已经添加了它,但结果我没有!),将 bean 发现更改为“全部”。现在,SpecializedDao 已正确注入。但是,NullPointerException 仍然存在。现在问题是实体管理器注入,因为异常是从 store() 方法的同一行传播的(和以前一样)。我会试着看看我是否能查明问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多