无法在EJB中捕获异常

时间:2015-02-01 17:49:31

标签: java exception ejb try-catch constraints

我正在使用在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
    }
}

1 个答案:

答案 0 :(得分:2)

这是预料之中的。刷新时抛出异常。刷新发生在事务提交时。并且在 EJB方法成功返回之后发生提交。

所以,与你说的相反,它不是抛出异常的persist()方法(堆栈跟踪会确​​认),而是包装EJB并提交事务的事务代理方法

除了

之外,除了这样的例外,你真的无能为力
  • 向用户显示错误消息。在这种情况下,在休息服务中捕获异常,或让一般异常处理程序处理它是正确的做法
  • 重试交易。在这种情况下,您应该在rest服务方法和EJB之间有一个中间层(或方法),它调用事务EJB,捕获异常并重试。