java – 你能用JAX-RS / Jersey做传统的Servlet过滤吗?
想象一下,您有一个启动数据库事务的过滤器,处理请求,然后尝试提交事务.
doFilter(...) { ... transaction.begin(); filterChain.doFilter(request,response); transaction.commit(); } 使用Jersey,有一些问题: >使用过滤器,Jersey Servlet容器在执行返回过滤器之前提交/刷新响应.因此,如果提交失败,则无法将返回代码修改为失败.此外,JAX-RS ExceptionMapper不会捕获异常. public ContainerRequest过滤器(ContainerRequest请求){ 这允许异常冒泡到ExceptionMapper,但是通过2个单独的方法/接口拆分逻辑.问题是,如果存在未映射到响应的异常,则永远不会调用ContainerResponseFilter,因此无法清理. 在JAX-RS环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,还是有一个我忽略的类或接口? 解决方法
对于JAX-RS / RESTEasy应用程序,我一直在研究这个问题.在阅读这个问题之前我正在考虑的两个选项:
>编写ExceptionMapper< Throwable> (或ExceptionMapper< DaoException>带有自定义DaoException)并在那里或在ContainerResponseFilter中处理它,因为ExceptionMapper<?>处理所有异常. 两种选择都存在问题. >我找到了一个ExceptionMapper< Throwable>过于宽泛,而ExceptionMapper< DaoException>可能会错过其他一些例外,再次使交易无法清理. 所以在看完你的问题后,我正在考虑: >使用ContainerRequestFilter启动事务(与@NameBinding注释构造结合使用).>使用ContainerResponseFilter提交事务(如果资源方法尚未关闭它).>使用过滤器确保事务已关闭,如果没有,则将其回滚. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |