gpt4 book ai didi

java - 无法捕获 EJB 中的异常

转载 作者:行者123 更新时间:2023-12-02 05:01:17 25 4
gpt4 key购买 nike

我正在使用运行在 Wildfly 8 上的 Jax-RS 和 EJB3 构建一个 Restful Web 服务。该系统分为两部分。休息模块和持久性模块。其余模块由带有方法的其余 servlet 组成,可在“mycontext/rest/do”下访问。该方法调用无状态bean的“do()”方法,该方法代表持久性模块的接口(interface)。 “do()”调用另一个无状态 bean 的“persistEntity(Entity e)”,它代表实体类的外观(一种接口(interface)模式)。我想要保留的实体有一些限制。如果它们被违反,则会抛出“ConstraintViolationException”之类的异常(我认为是由 EJB 容器引发的)。我 try catch 持久性模块中两个无状态 bean 之一的异常,但这不起作用。这意味着catch block 中的代码不会被执行。但捕获 servlet 中的异常是有效的。

Rest servlet(捕获异常在这里起作用):

@Path("/rest")
public class AccountRestService {
@Inject
private Service service;
@POST
public void do(Entity entity) {
service.do(entity);
}
}

表示持久化模块接口(interface)的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
}
}

最佳答案

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

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

对于这样的异常,除了

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

关于java - 无法捕获 EJB 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com