doFilter(...) { ... transaction.begin(); filterChain.doFilter(request,response); transaction.commit(); }
使用Jersey,有一些问题:
>使用过滤器,Jersey Servlet容器在执行返回过滤器之前提交/刷新响应.因此,如果提交失败,则无法将返回代码修改为失败.此外,JAX-RS ExceptionMapper不会捕获异常.
>使用ContainerRequestFilter / ContainerResponseFilter.
public ContainerRequest过滤器(ContainerRequest请求){
…
}
public ContainerResponse过滤器(ContainerRequest请求,ContainerResponse响应){
…
}
这允许异常冒泡到ExceptionMapper,但是通过2个单独的方法/接口拆分逻辑.问题是,如果存在未映射到响应的异常,则永远不会调用ContainerResponseFilter,因此无法清理.
在JAX-RS环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,还是有一个我忽略的类或接口?
解决方法
>编写ExceptionMapper< Throwable> (或ExceptionMapper< DaoException>带有自定义DaoException)并在那里或在ContainerResponseFilter中处理它,因为ExceptionMapper<?>处理所有异常.
>在transaction.begin()之前,检查事务的当前状态,并在需要时回滚.
两种选择都存在问题.
>我找到了一个ExceptionMapper< Throwable>过于宽泛,而ExceptionMapper< DaoException>可能会错过其他一些例外,再次使交易无法清理.
>在下一个请求中回滚事务可能需要很长时间,可能会导致其他事务的锁定问题.
所以在看完你的问题后,我正在考虑:
>使用ContainerRequestFilter启动事务(与@NameBinding注释构造结合使用).>使用ContainerResponseFilter提交事务(如果资源方法尚未关闭它).>使用过滤器确保事务已关闭,如果没有,则将其回滚.