我需要一些指导如何在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实例或类似的东西。
答案 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。