Java @EJB workflowDao在服务层中为空

Java @EJB workflowDao在服务层中为空,java,ejb,dao,Java,Ejb,Dao,我试图弄清楚如何在我的应用程序中设置服务/Dao层。我找到了几十种不同方法的资源,并决定遵循以下模型: 我不知道我错过了什么导致了这个NPE 用法: @Path("/helloworld") public class MyController { @GET @Produces(MediaType.TEXT_PLAIN) public String TestRequest() { Workflow workflow = new Workflow();

我试图弄清楚如何在我的应用程序中设置服务/Dao层。我找到了几十种不同方法的资源,并决定遵循以下模型:

我不知道我错过了什么导致了这个NPE

用法:

@Path("/helloworld")
public class MyController {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String TestRequest() {
        Workflow workflow = new Workflow();
        workflow.setName("test");

        WorkflowService workflowService = new WorkflowService();
        workflowService.save(workflow);

        return "Workflow ID:";
    }
}
@Stateless
public class WorkflowDao {

    @PersistenceContext(unitName = "unit")
    private EntityManager entityManager;

    public int save(Workflow workflow) {
        entityManager.persist(workflow);
        return workflow.getId();
    }
}
@Stateless
public class WorkflowService {

    @EJB
    WorkflowDao workflowDao;

    public int save(Workflow workflow) {
        int id = workflowDao.save(workflow); //throws NullPointerException because workflowDao is null
        return id;
    }
}
我的刀:

@Path("/helloworld")
public class MyController {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String TestRequest() {
        Workflow workflow = new Workflow();
        workflow.setName("test");

        WorkflowService workflowService = new WorkflowService();
        workflowService.save(workflow);

        return "Workflow ID:";
    }
}
@Stateless
public class WorkflowDao {

    @PersistenceContext(unitName = "unit")
    private EntityManager entityManager;

    public int save(Workflow workflow) {
        entityManager.persist(workflow);
        return workflow.getId();
    }
}
@Stateless
public class WorkflowService {

    @EJB
    WorkflowDao workflowDao;

    public int save(Workflow workflow) {
        int id = workflowDao.save(workflow); //throws NullPointerException because workflowDao is null
        return id;
    }
}
我的服务:

@Path("/helloworld")
public class MyController {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String TestRequest() {
        Workflow workflow = new Workflow();
        workflow.setName("test");

        WorkflowService workflowService = new WorkflowService();
        workflowService.save(workflow);

        return "Workflow ID:";
    }
}
@Stateless
public class WorkflowDao {

    @PersistenceContext(unitName = "unit")
    private EntityManager entityManager;

    public int save(Workflow workflow) {
        entityManager.persist(workflow);
        return workflow.getId();
    }
}
@Stateless
public class WorkflowService {

    @EJB
    WorkflowDao workflowDao;

    public int save(Workflow workflow) {
        int id = workflowDao.save(workflow); //throws NullPointerException because workflowDao is null
        return id;
    }
}

这是我第一次设置Java项目(之前只在1上工作过,它使用了Spring),所以如果这看起来非常错误,请记住这一点。

WorkflowDao
不是EJB,它是带有
@无状态注释的POJO。因此,用
@EJB
注入它自然会失败,创建一个null
workflowDao
属性,并最终生成一个
NullPointerException

要使
WorkflowDao
成为一个完整的EJB,除了具有
@无状态的
@有状态的
注释外,还需要实现本地、远程或两个接口,并且这些接口必须分别用
@local
@remote
注释。详情请参阅

另外,很可能(这可能依赖于应用程序服务器)您必须在应用程序的xml描述符文件中注册EJB—例如,在web.xml的
元素中


作为旁注,使用EJB作为DAO不是一个好主意,EJB通常用于实现业务逻辑(可以从这里调用持久化/合并操作),但现在实际的持久化层是使用JPA实现的。换句话说,
WorkflowService
应该是EJB服务,不需要向其中注入EJB,也不需要单独的DAO层-JPA实体履行此角色。

如果手动实例化WorkflowService,容器将不会执行任何注入,因为WorkflowService不是由容器管理的

我建议你:

  • 注释Jax-RS资源@Stateless

  • 将WorkfloService作为成员通过@EJB注入

不再需要实现本地或远程接口

@Path("workflows")
@Stateless
public class WorkFlowResource{
  @EJB
  WorkflowService workflowService;
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String TestRequest() {
    Workflow workflow = new Workflow();
    workflow.setName("test");
    workflowService.save(workflow);
    return "Workflow ID:";
    }

}

哪一行抛出空指针异常?为什么
@Stateless
不正确?我经常在DAO对象()上看到,如果我不使用EJB,如何正确地使DAO可用于我的服务?@Webnet我澄清了我的答案。这并不是说
@Stateless
是错误的,而是这还不够:类需要实现本地/远程接口。如果您不打算使用EJB,则只需在类中实例化DAO,不要将其注入,或者将其作为POJO而不是EJB注入(取决于您使用的框架)。
@EJB
注释是为注入实际的EJB而保留的,当您说
Jax-RS-Resource
您指的是什么?我的Dao是如何与服务链接的?应该是@EJB还是别的什么?我想你的类有@GET@products(MediaType.TEXT_PLAIN)是我添加的JAX-RS资源
@EJB WorkflowService WorkflowService到MyController类,而不是实例化它。它现在在
workflowService.save(工作流)
处抛出一个NPE。我以前从未使用过@EJB,所以我正在努力解决这个问题……你的MyController类是什么?您是否手动实例化它?像new MyController()?不,这是一个使用grizzly的jersey应用程序。我尝试了上面显示的方法,它说
workflowService.save(workflow)
为空。