如何处理JAX-RS中的意外exception

我的技术堆栈是Tomcat(servlet 3.0),Jersey用于JAX-RS,Spring和Hibernate。 当Hibernate中的某些数据转换错误出现意外问题时,我不希望客户端看到我的堆栈跟踪是否存在Tomcat尝试默认打印的exception。 但是,我想记录这些exception,以便找出错误并解决问题。

我的第一次尝试是使用来自JAX-RS的ExceptionMapper,并天真地认为可以解决我的问题。 但后来我发现泽西岛抛出了自己的例外,例如未映射的url是com.sun.jersey.api.NotFoundExceptions。 这会导致记录404exception,这是我不想要的。 更糟糕的是,客户端不再获得404而是获得状态代码500。

我可以为jersey抛出的exception创建exception映射器,但我可能会错过一些东西。 这样的事情有最好的做法吗?

Jersey直接抛出的所有exception都是WebApplicationException的子类,所以如果你想捕获它们,只需为该类创建一个ExceptionMapper,你就会很好。

请看这个页面: http : //www.rexsl.com/rexsl-core/trap.html 。 它解释了如何/应该捕获Web应用程序中的所有运行时exception。 使用ExceptionMapper建议解决方案只能捕获JAX-RSexception,这是不够的,特别是如果您使用的是DB和Hibernate。

ExceptionTrap类的源代码在这里 。