gpt4 book ai didi

java - 您可以使用 JAX-RS/Jersey 进行传统的 Servlet 过滤吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:13 24 4
gpt4 key购买 nike

假设您有一个过滤器,它启动数据库事务、处理请求,然后尝试提交事务。

doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}

使用Jersey,有一些问题:

  1. 使用过滤器,Jersey Servlet 容器在执行返回到您的过滤器之前提交/刷新响应。因此,如果提交失败,则不能将返回码修​​改为失败。此外,JAX-RS ExceptionMapper 不会捕获异常。
  2. 使用 ContainerRequestFilter/ContainerResponseFilter。

    公共(public) ContainerRequest 过滤器(ContainerRequest 请求){ ...
    公共(public) ContainerResponse 过滤器(ContainerRequest 请求,ContainerResponse 响应){ ...

这允许异常冒泡到 ExceptionMapper,但将逻辑拆分为 2 个单独的方法/接口(interface)。问题在于,如果存在未映射到响应的异常,则永远不会调用 ContainerResponseFilter,因此您无法清理。

在 JAX-RS 环境中处理此问题的首选方法是什么?有没有办法配置响应的刷新,或者是否有我忽略的类或接口(interface)?

最佳答案

我也针对 JAX-RS/RESTEasy 应用程序对此进行了一些研究。在阅读这个问题之前我正在考虑的两个选项:

  1. 写一个ExceptionMapper<Throwable> (或使用自定义 ExceptionMapper<DaoException>DaoException )并在那里或在 ContainerResponseFilter 中处理它由于 ExceptionMapper<?> 将被执行处理所有异常。
  2. 之前transaction.begin() ,检查事务的当前状态,并在需要时回滚。

两种选择都有问题。

  1. 我找到一个 ExceptionMapper<Throwable>太宽泛了,而ExceptionMapper<DaoException>可能会错过其他一些异常,再次导致交易未清理。
  2. 在下一个请求时回滚事务可能需要很长时间,可能会导致其他事务出现锁定问题。

所以在阅读您的问题后,我目前在想:

  • 使用 ContainerRequestFilter开始交易(结合 @NameBinding 注释构造)。
  • 使用 ContainerResponseFilter提交事务(如果资源方法尚未关闭它)。
  • 使用 Filter以确保事务已关闭,如果未关闭,则将其回滚。

关于java - 您可以使用 JAX-RS/Jersey 进行传统的 Servlet 过滤吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com