Java @EJB workflowDao在服务层中为空
我试图弄清楚如何在我的应用程序中设置服务/Dao层。我找到了几十种不同方法的资源,并决定遵循以下模型: 我不知道我错过了什么导致了这个NPE 用法: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();
@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
注入它自然会失败,创建一个nullworkflowDao
属性,并最终生成一个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)
为空。