想象一下,您有一个过滤器,用于启动数据库事务,处理请求,然后尝试提交事务。你能用JAX-RS/Jersey做传统的Servlet过滤吗?
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
使用泽西,也存在一些问题:
- 使用过滤器,泽西Servlet容器提交/刷新执行返回到过滤器,然后响应。因此,如果提交失败,则无法将返回码修改为失败。此外,异常不会被JAX-RS ExceptionMapper捕获。
使用ContainerRequestFilter/ContainerResponseFilter。
公共ContainerRequest滤波器(ContainerRequest请求){ ... }
公共ContainerResponse滤波器(ContainerRequest请求,响应ContainerResponse){ ... }
这允许例外冒泡到一个ExceptionMapper,但是将逻辑分成两个独立的方法/接口。问题是如果有一个异常没有映射到响应,那么ContainerResponseFilter永远不会被调用,所以你无法清理。
在JAX-RS环境中处理这种情况的首选方法是什么?有没有办法配置刷新响应,还是有我忽略的类或接口?
您描述的内容通常称为“开放会议”(反)模式。请参阅[此SO问题](http://stackoverflow.com/q/1103363/131929)进行讨论。还请转到JBoss(Hibernate/Seam)以获得更多讨论,例如https://community.jboss.org/docs/DOC-13954 – 2013-05-13 21:07:02
对于“视图”究竟构成了什么,肯定存在一些争议,但这只是一个REST应用程序。 jax-rs资源方法是服务层,它们直接使用持久性。响应对象是服务调用的结果。我试图避免在每种方法中都进行事务管理,答案或者是类似于过滤器的东西,或者是我连接CDI拦截(如果可以的话,我希望在此项目中避免这种情况)。 – Shaun 2013-05-14 09:38:13