加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 你能用JAX-RS / Jersey做传统的Servlet过滤吗?

发布时间:2020-12-14 19:36:12 所属栏目:Java 来源:网络整理
导读:想象一下,您有一个启动数据库事务的过滤器,处理请求,然后尝试提交事务. doFilter(...) { ... transaction.begin(); filterChain.doFilter(request,response); transaction.commit();} 使用Jersey,有一些问题: 使用过滤器,Jersey Servlet容器在执行返回过滤
想象一下,您有一个启动数据库事务的过滤器,处理请求,然后尝试提交事务.
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环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,还是有一个我忽略的类或接口?

解决方法

对于JAX-RS / RESTEasy应用程序,我一直在研究这个问题.在阅读这个问题之前我正在考虑的两个选项:

>编写ExceptionMapper< Throwable> (或ExceptionMapper< DaoException>带有自定义DaoException)并在那里或在ContainerResponseFilter中处理它,因为ExceptionMapper<?>处理所有异常.
>在transaction.begin()之前,检查事务的当前状态,并在需要时回滚.

两种选择都存在问题.

>我找到了一个ExceptionMapper< Throwable>过于宽泛,而ExceptionMapper< DaoException>可能会错过其他一些例外,再次使交易无法清理.
>在下一个请求中回滚事务可能需要很长时间,可能会导致其他事务的锁定问题.

所以在看完你的问题后,我正在考虑:

>使用ContainerRequestFilter启动事务(与@NameBinding注释构造结合使用).>使用ContainerResponseFilter提交事务(如果资源方法尚未关闭它).>使用过滤器确保事务已关闭,如果没有,则将其回滚.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读