【发布时间】:2017-03-19 12:21:24
【问题描述】:
我在使用由 EJB Container 管理的 entityManager 时遇到问题。
在我的耳朵里,我有 3 个模块:
-domain - 实体类和 DAO 实现将接口作为 EJB。
-services - 我将有与处理请求相关的逻辑,根据库异常(例如数据库异常)调用业务异常。
-Rest 服务 - 在那里我将有其他端点来接收和发送一些业务对象。
所以主要问题是在服务层使用 EJB,我可以将 Rest 端点类、服务类和 DAO 类声明为 EJB。但是这样我就无法捕获与数据库相关的异常,因为当我变红时,我在 WildFly 提供的 EJB 容器中得到 transactionRollback 异常,并且这个异常在提交事务时存在。
我考虑过从服务类中删除@Stateless 注释,但是当我这样做时,EJB 容器不要在我的 DAO 类中注入 entityManager。我也尝试在服务类中使用@Inject 注解,但在 Dao 类中的 entityManager 上仍然得到相同的 NullPointer 异常。
下面我在我的项目中添加示例代码实现:
DAO 类:
@Stateless
public class CardDaoImpl implements CardDao {
@PersistenceContext(unitName = "test")
protected EntityManager em;
public CardBase addCardToDatabase(CardBase card) {
em.persist(card);
return card;
}
Service Class(这里我要处理businessExceptions):
@Stateless
public class TestService implements TestServiceIf {
@EJB(beanInterface = CardDao.class)
private CardDao dao;
@Override
public CardBase addCard(CardBase card) {
dao.addCardToDatabase(card);
return card;
}
}
休息端点类:
@Stateless
@Path("/test")
public class Test {
@EJB(beanInterface = TestServiceIf.class)
private TestServiceIf service;
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String addCard() {
CardBase card = new SampleCard();
//Setting card object fields//
service.addCard(card);
return "Hello";
}
}
这只是我发现的一种解决方案。但是抛出我的 businnesExceptions 是怎么回事?也许将它们扔到这个服务层不是一个好习惯?
【问题讨论】:
-
你的服务器和你的ejb版本是什么?不幸的是,根据服务器的说法,即使对于 EJB 规范,您也有特殊性。
-
我正在使用 Wildfly 10。在此应用程序服务器的模块中,我找到了 EJB3.2 api
标签: jpa dependency-injection nullpointerexception ejb entitymanager