java - 无法捕获 EJB 中的异常

标签 java exception ejb try-catch constraints

我正在使用运行在 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/

相关文章:

java - Scala 的 2.9.1 编译器会丢弃类型参数信息吗?

java - 使用 Firestore,如何使用 java 类序列化文档中的引用类型字段?

javascript - 有没有办法在开始执行 javascript 之前转换由 HtmlUnit 加载的页面?

java - 错误消息 Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException :

java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 0 in AWT

maven - 如何使用 maven 发布本地和远程 ejb api

java - JPA 枚举类型映射。最佳方法

jakarta-ee - 将 ear 文件转换为 war 文件的最佳实践

jsf - 为什么抛出 EJBException 而不是 NoResulException?

C# 可以在不捕获的情况下检查异常吗?