假设您有一个过滤器,它启动数据库事务、处理请求,然后尝试提交事务。
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
使用 Jersey,有一些问题:
- 使用过滤器,Jersey Servlet 容器在执行返回到您的过滤器之前提交/刷新响应。因此,如果提交失败,您不能将返回码修改为失败。此外,JAX-RS ExceptionMapper 不会捕获异常。
使用 ContainerRequestFilter/ContainerResponseFilter。
public ContainerRequest filter(ContainerRequest request) { ... }
public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { ... }
这允许异常冒泡到 ExceptionMapper,但将逻辑拆分为 2 个单独的方法/接口。问题是,如果存在未映射到响应的异常,则永远不会调用 ContainerResponseFilter,因此您无法清理。
在 JAX-RS 环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,或者是否有我忽略的类或接口?