Sha*_*aun 5 java jax-rs jersey java-ee servlet-filters
想象一下,您有一个启动数据库事务的过滤器,处理请求,然后尝试提交事务.
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
使用Jersey,有一些问题:
使用ContainerRequestFilter/ContainerResponseFilter.
public ContainerRequest过滤器(ContainerRequest请求){...}
公共ContainerResponse过滤器(ContainerRequest请求,ContainerResponse响应){...}
这允许异常冒泡到ExceptionMapper,但是通过2个单独的方法/接口拆分逻辑.问题是,如果存在未映射到响应的异常,则永远不会调用ContainerResponseFilter,因此无法清理.
在JAX-RS环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,还是有一个我忽略的类或接口?
我也一直在针对 JAX-RS/RESTEasy 应用程序进行一些研究。在阅读这个问题之前我正在考虑的两个选择:
ExceptionMapper<Throwable>(或ExceptionMapper<DaoException>使用自定义的DaoException)并在那里或在ContainerResponseFilter由于ExceptionMapper<?>处理所有异常而将被执行的中处理它。transaction.begin(),检查事务的当前状态,并在需要时回滚。两种选择都存在问题。
ExceptionMapper<Throwable>太广,而ExceptionMapper<DaoException>可能会错过一些其他异常,再次导致事务未清理。所以读完你的问题后,我现在在想:
ContainerRequestFilter启动事务(与@NameBinding注释构造结合)。ContainerResponseFilter提交事务(如果资源方法尚未关闭它)。Filter确保事务已关闭,如果没有,则回滚。| 归档时间: |
|
| 查看次数: |
2884 次 |
| 最近记录: |