【问题标题】:Cant catch exception in EJB无法在 EJB 中捕获异常
【发布时间】:2015-03-31 16:39:02
【问题描述】:

我正在使用在 Wildfly 8 上运行的 Jax-RS 和 EJB3 构建一个安静的 Web 服务。系统分为两部分。一个休息模块和一个持久性模块。 rest 模块由一个带有方法的 rest servlet 组成,可在“mycontext/rest/do”下访问。该方法调用代表持久性模块接口的无状态bean 的方法“do()”。 “do()”调用另一个无状态 bean 的“persistEntity(Entity e)”,它表示实体类的外观(一种接口模式)。我要坚持的实体有一些限制。如果它们被违反,则会抛出诸如“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);
     }
 }

实体外观(捕捉异常被忽略):

@Stateless
public class EntityFacade{
    @PersistenceContext(unitName = "primary")
    private EntityManager em;
    public void create(Entity entity){
        em.persist(entity); // this line throws exception like ConstraintViolationException
    }
}

【问题讨论】:

    标签: java exception ejb try-catch constraints


    【解决方案1】:

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

    因此,与您所说的相反,不是persist() 方法引发异常(堆栈跟踪会确​​认这一点),而是包装您的EJB 并提交事务的事务代理的方法。

    除了这样的例外,你真的无能为力

    • 向用户显示错误消息。在这种情况下,在 rest 服务中捕获异常,或者让通用异常处理程序处理它是正确的做法
    • 重试事务。在这种情况下,您应该在 rest 服务方法和 EJB 之间有一个中间层(或方法),它调用事务性 EJB,捕获异常并重试。

    【讨论】:

    • 特别想为解决方案 +1。但是没有足够的声誉:)
    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2021-08-07
    • 2021-10-14
    • 2019-11-27
    • 2014-05-02
    • 2017-03-15
    • 2013-11-23
    相关资源
    最近更新 更多