Java EE:抛出@ApplicationException,仍然回滚事务

时间:2011-06-08 07:40:00

标签: exception-handling java-ee transactions ejb

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

目前,我有许多例外情况,所有例外情况均为RuntimeException,并附有@ApplicationException(rollback=false)注释。为了将它们传输到客户端,它们带有一个带JAXB注释的实体;并且ExceptionMapper已准备好将它们转换为正确,有意义的HTTP响应(包括HTTP状态代码)。

我没有关于交易行为的任何指定,所以我猜它默认为CMT。

到目前为止很棒的东西:当服务器决定时,它无法满足请求,因为输入数据无效/足够/无论如何,它会抛出我的一个BadRequestException,这使得它成为JAX-RS资源,它被映射到HTTP响应。客户被告知出了什么问题。

问题我的问题是我总是得到javax.ejb.TransactionRolledbackLocalException,由BadRequestException引起!我不希望该事务被回滚! @ApplicationException似乎被忽略了......

我是否应该从RuntimeException延伸,而是使用已检查的例外?我认为@ApplicationException应该是正确的方式......

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

2 个答案:

答案 0 :(得分:4)

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

看这里帮了我 - > https://www.java.net//node/665096

答案 1 :(得分:2)

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

根据定义,@ApplicationException a RuntimeException。实际上,抛出RuntimeExceptions似乎是一个非常糟糕的主意,这就是拆除bean实例,回滚事务等等。

将所有内容切换为基于已检查的例外后,我的代码不仅看起来好多了,而且IDE也支持我更好。它就像一个魅力。现在我可以控制,如果我的ApplicationException应该导致事务回滚。

我发现this link很有用,即使它描述了Bea Weblogic。