Exception handling Java EE:@ApplicationException已抛出,仍回滚事务

Exception handling Java EE:@ApplicationException已抛出,仍回滚事务,exception-handling,jakarta-ee,transactions,ejb,Exception Handling,Jakarta Ee,Transactions,Ejb,我需要一些指导,如何在JavaEE环境中最好地使用异常,通过JAX-RS为客户机提供服务 目前,我有许多异常,它们都扩展了RuntimeException,并用@ApplicationException(rollback=false)进行了注释。为了将它们传输到客户机,它们携带一个JAXB注释实体;一个例外标记准备将它们转换为正确、有意义的HTTP响应(包括HTTP状态代码) 我没有关于事务行为的任何规定,所以我猜它默认为CMT 到目前为止,这是一件了不起的事情:当服务器做出决定时,它无法完成一

我需要一些指导,如何在JavaEE环境中最好地使用异常,通过JAX-RS为客户机提供服务

目前,我有许多异常,它们都扩展了
RuntimeException
,并用
@ApplicationException(rollback=false)
进行了注释。为了将它们传输到客户机,它们携带一个JAXB注释实体;一个
例外标记
准备将它们转换为正确、有意义的HTTP响应(包括HTTP状态代码)

我没有关于事务行为的任何规定,所以我猜它默认为CMT

到目前为止,这是一件了不起的事情:当服务器做出决定时,它无法完成一个请求,因为输入数据无效/不足/不管怎样,它会抛出一个我的
BadRequestException
,这使它进入JAX-RS资源,并在那里映射到HTTP响应。客户被告知出了什么问题

我遇到的问题是,我总是得到一个
javax.ejb.TransactionRolledbackLocalException
,这是由
BadRequestException
引起的!我不希望交易被回滚!@ApplicationException似乎已被忽略

我是否应该不从
RuntimeException
扩展,而是使用选中的异常?我认为@ApplicationException应该是正确的方法


背景信息:我的所有异常都使容器/bean处于工作状态。不需要销毁bean实例或诸如此类的东西。

好的,阅读手册有时会有所帮助:)

根据定义,
@ApplicationException
不是
运行时异常。事实上,抛出
RuntimeExceptions
似乎是一个非常糟糕的主意,这会破坏bean实例、回滚事务等

在将所有内容切换为基于检查的异常之后,我的代码不仅看起来更好,IDE也更好地支持我。它就像一个符咒。现在我可以控制我的
ApplicationException
是否应该导致事务回滚


我发现它很有用,尽管它为Bea Weblogic描述了它。

对于其他遇到同样问题的人: 当EJBJAR中不包含异常类时,将忽略注释@ApplicationException(未扫描/未处理)。当ApplicationException是API jar的一部分时,这是一种常见的情况。在这种情况下,我们必须使用XML描述符来标记ApplicationException


查看这里帮助了我->

EJB3.1规范,第14.2.1节:“未检查异常的应用程序异常通过使用ApplicationException元数据注释来定义为应用程序异常,或者在部署描述符中使用application exception元素来表示。”谢谢。奇怪的是Glassfish 3.1没有遵循规范。这个答案是不正确的,并且包含错误的信息。从bkail引用的EJB规范中再引用一点:“被检查为异常的应用程序异常可以通过在bean的businessinterface、no interface view、home interface、component interface和web服务端点的方法的throws子句中列出来定义。通过使用ApplicationException元数据注释将未检查异常的应用程序异常定义为应用程序异常。“这很有帮助。你可能想知道,这是作为一个在GF3中修复的bug提交的:我在wildfly 10.0 Final中遇到了同样的问题。当异常位于不同的应用程序和不同的EJB中时,该异常不会导致回滚(提交)。当我移动它时,它工作得很好。