我正在使用在wildfly 8上运行的Jax-RS和EJB3构建一个安静的Web服务。该系统分为两部分。休息模块和持久性模块。其余模块由一个带有方法的rest servlet组成,可以在" mycontext / rest / do"下进行访问。这个方法调用方法" do()"无状态bean的表示持久性模块的接口。 " DO()"呼叫" persistEntity(实体e)"另一个无状态bean,表示实体类的外观(一种接口模式)。我想要坚持的实体有一些限制。如果他们违反了像#34; ConstraintViolationException"被抛出(我认为是EJB容器)。我尝试在持久性模块中的两个无状态bean之一中捕获异常,但这不起作用。这意味着catch块中的代码不会被执行。但是在servlet中捕获异常是有效的。
Rest servlet(捕获异常在这里工作):
@Path("/rest")
public class AccountRestService {
@Inject
private Service service;
@POST
public void do(Entity entity) {
service.do(entity);
}
}
Bean表示持久性模块的接口(忽略捕获异常):
@Stateless
@LocalBean
public class Service {
@Inject
private EntityFacade facade;
public void do(Entity entity) {
facade.persist(entity);
}
}
Entity Facade(忽略捕获异常):
@Stateless
public class EntityFacade{
@PersistenceContext(unitName = "primary")
private EntityManager em;
public void create(Entity entity){
em.persist(entity); // this line throws exception like ConstraintViolationException
}
}
答案 0 :(得分:2)
这是预料之中的。刷新时抛出异常。刷新发生在事务提交时。并且在 EJB方法成功返回之后发生提交。
所以,与你说的相反,它不是抛出异常的persist()方法(堆栈跟踪会确认),而是包装EJB并提交事务的事务代理方法
除了
之外,除了这样的例外,你真的无能为力