我需要一些指导,如何在 Java EE 环境中最好地使用异常,通过 JAX-RS 为客户端提供服务。
目前,我有许多异常(exception),都扩展 RuntimeException
,并用 @ApplicationException(rollback=false)
注释。为了将它们传输到客户端,它们携带了一个 JAXB 注释的实体; ExceptionMapper
准备将它们转换为正确的、有意义的 HTTP 响应(包括 HTTP 状态代码)。
我没有任何关于交易行为的说明,所以我猜它默认为 CMT。
到目前为止的好东西:当服务器决定时,它无法满足请求,因为输入数据无效/足够/无论如何,它抛出我的 BadRequestException
之一,这使它成为 JAX-RS 资源,在那里它被映射到HTTP 响应。客户被告知出了什么问题。
我遇到的 问题是我总是得到 javax.ejb.TransactionRolledbackLocalException
,这是由 BadRequestException
引起的!我不希望事务被回滚! @ApplicationException 似乎被忽略了......
我不应该从 RuntimeException
扩展而是使用检查异常吗?我虽然@ApplicationException 应该是正确的方法......
有关背景信息:我的所有异常都使容器/bean 处于工作状态。不需要销毁 bean 实例或类似的东西。
最佳答案
对于其他遇到同样问题的人:
当 ejb-jar 中不包含 Exception 类时,注释 @ApplicationException 将被忽略(未扫描/未处理)。当我们的 ApplicationException 是 API jar 的一部分时,这是一种常见情况。在这种情况下,我们必须使用 XML 描述符来标记 ApplicationException。
看这里对我有帮助-> https://www.java.net//node/665096
关于exception-handling - Java EE : @ApplicationException thrown, 仍然回滚事务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6275626/