【发布时间】:2013-05-07 21:53:44
【问题描述】:
假设您有一个过滤器,它启动数据库事务、处理请求,然后尝试提交事务。
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
使用 Jersey,有一些问题:
- 使用过滤器,Jersey Servlet 容器在执行返回到您的过滤器之前提交/刷新响应。因此,如果提交失败,您不能将返回码修改为失败。此外,JAX-RS ExceptionMapper 不会捕获异常。
-
使用 ContainerRequestFilter/ContainerResponseFilter。
public ContainerRequest filter(ContainerRequest request) { ... }
公共 ContainerResponse 过滤器(ContainerRequest 请求,ContainerResponse 响应){ ... }
这允许异常冒泡到 ExceptionMapper,但将逻辑拆分为 2 个单独的方法/接口。问题是如果有一个没有映射到响应的异常,ContainerResponseFilter 永远不会被调用,所以你无法清理。
在 JAX-RS 环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,或者有没有我忽略的类或接口?
【问题讨论】:
-
您所描述的通常称为“视图中的打开会话”(反)模式。请参阅this SO question 进行讨论。也转向 JBoss (Hibernate/Seam) 进行更多讨论,例如community.jboss.org/docs/DOC-13954
-
对于“视图”究竟由什么构成肯定存在一些争论,但这只是一个 REST 应用程序。 jax-rs 资源方法是服务层,它们直接使用持久性。响应对象是服务调用的结果。我试图避免在每种方法中都进行事务管理,答案是类似于过滤器的东西,或者我连接 CDI 拦截(如果可以的话,我想在项目的这一点上避免这种情况)。
标签: java jakarta-ee jersey jax-rs servlet-filters