当前位置: 首页 > 知识库问答 >
问题:

你能用JAX-RS/Jersey做传统的Servlet过滤吗?

阎宾实
2023-03-14

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

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

使用泽西,存在一些问题:

>

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

    公共ContainerRequest筛选器(ContainerRequest请求){...}
    公共ContainerResponse筛选器(ContainerRequest请求,ContainerResponse响应){...}

    这允许异常冒泡到ExceptionMapper,但将逻辑拆分为两个单独的方法/接口。问题是,如果有一个未映射到响应的异常,则永远不会调用ContainerResponseFilter,因此您无法进行清理。

    在JAX-RS环境中处理这个问题的首选方法是什么?是否有一种方法来配置响应的刷新,或者是否有一个我忽略的类或接口?

  • 共有1个答案

    厍彭薄
    2023-03-14

    我对JAX-RS/Resteasy应用程序也做了一些研究。我在读这个问题之前考虑的两个选项:

    1. 编写ExceptionMapper (或使用自定义的DaoException)并在此处或ContainerResponseFilter中处理它,因为ExceptionMapper<?>处理所有异常。
    2. transaction.begin()之前,请检查事务的当前状态,并在需要时回滚到该状态。

    这两种选择都有问题。

    1. 我发现exceptionmapper 太宽,而exceptionmapper 可能遗漏了一些其他异常,从而再次导致事务未被清理。
    2. 在下一个请求中回滚事务可能需要很长时间,这可能会导致其他事务的锁定问题。

    所以看了你的问题,我目前在想:

    • 使用ContainerRequestFilter启动事务(与@NameBinding注释构造结合使用)。
    • 使用ContainerResponseFilter提交事务(如果资源方法尚未关闭它)。
    • 使用筛选器确保事务已关闭,如果未关闭,则将其回滚。
     类似资料:
    • 问题内容: 在常规的Web应用程序中,我可以为各种路径(例如,身份验证,授权,错误,日志记录等)分配一系列过滤器。 好处是我编写servlet时专注于核心功能,而不必担心基础结构方面。我可以编写正交的,跨领域的过滤器以进行身份​​验证,授权等。然后,可以将它们编织到web.xml中。查看web.xml足以确保我的应用程序中没有漏洞。 在JAX-RS或Jersey中有可能吗?如果没有,我最好的选择是

    • 我们可以通过 实现创建JAX-RS示例。 为此,需要加载 jersey相关jar文件或使用Maven框架。 在这个例子中,我们使用jersey jar文件来实现JAX-RS jersey示例。 Jersey Jar文件下载网址:https://jersey.github.io/download.html 打开Eclipse,创建一个Web工程: restfuljersey,如下图所示 - JAX-

    • 我正在学习Jersey/JAX-RS,需要一些ExceptionMapper方面的帮助。 我有一个UserFacade类、AbstractFacade类和User类本身,它们都是非常标准的,主要是通过在NetBeans中创建一个新的Web服务RestFUL项目生成的。我的问题是,我想现在开始捕捉错误,比如“唯一约束违反”错误。我想我需要实现一个异常映射器...我的门面有以下内容: 这是我得到的错误

    • JAX-RS是否可以只使用带有注释的Servlet3.0(特别是Tomcat7)来实现,而不必实现另一个Servlet容器? 如果不是,请解释为什么下面这本书中的引用是不正确的,或者是我对它的解释是错误的。 因为此示例部署在Java EE应用程序服务器或独立的Servlet3.x容器中,所以我们只需要一个空的web.xml文件。服务器将检测到某个应用程序类在您的WAR中,并自动部署它。(带有JAX

    • 我有一个基本的REST web服务可以工作,但我确实有一个问题。下面是一个简短的代码片段。

    • 我正试图在NetBeans 7.4(今天发布)和GlassFish 4服务器下开发JAX-RS。 显然,NetBeans 7.4 应该使用 Jersey 2.0,但是在库下查看项目内的库 - javax.servlet-api.jar javax.ws.rs-api.jar … 所以我不确定Jersey和服务器使用的是哪个版本。因此,第一个问题是:我是否需要在运行时使用与编译时相同的JAX-RS实