JAX-RS(泽西岛)ExceptionMapper - @Context 注入静态/单例类 - 它有效,但为什么呢?

2024-01-02

我有一个单实例类,实现 ExceptionMapper。它不是一个静态类,但我知道它只创建了一个实例(我检查过 - 构造函数仅被调用一次)。

我的班级使用@Context HttpServletRequest,我可以清楚地观察到,当我的ExceptionMapper.toResponse()方法被调用时,@Context'请求'参数具有与引发异常的请求相关的值。

医生说 https://jersey.github.io/documentation/latest/jaxrs-resources.html#d0e2760这确实是设计支持的功能,并且是通过使用“代理”来完成的。

我想知道这是如何实现的 - 单个实例如何同时具有不同的成员变量值?

谢谢你,
AG

P.S.:这是测试代码:

@Provider
public class MyExceptionMapper implements ExceptionMapper<Exception> {

    public MyExceptionMapper() {
        System.out.println("CTOR!!");
    }

    @Context HttpServletRequest req;

    public static boolean done = false;  
    public Response toResponse(Exception ex) {
        if (!done) {
            done = true;
            Thread.sleep(10000);
        }
        System.out.println(req.getRequestURI());
        return null;
    }
}

我的 REST 处理程序方法抛出异常,因此当我“并行”执行以下 2 个请求时(上面的睡眠确保当第二个请求到达时第一个请求尚未完成,恕我直言,应该修改唯一的“req”字段):

- http://localhost/app/one
- http://localhost/app/two

我的程序打印:

CTOR!
http://localhost/app/one
http://localhost/app/two

实现您观察到的效果的最简单方法是注射HttpServletRequest对象实际上是一个代理对象,一个线程感知的委托real HttpServletRequest。当您调用委托上的方法时,它们所做的就是查找正确的真实对象(例如,通过线程局部变量)并将调用传递到该对象上。这种策略相对简单,而且由于它是一个接口,我们绝对不必担心字段访问(这对于代理来说相当棘手)。

有几种不同的方法可以构造这样的代理对象。特别是,可以通过直接实施HttpServletRequest接口,或者可以通过 Java 更通用地完成通用动态代理机制 http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html(可以为任何接口构造代理)。还有其他更复杂的可能性,例如运行时代码生成,但它们在这里是不必要的。 OTOH,如果HttpServletRequest直接实施;对于 JAX-RS 实现来说,它是一个相当重要的类……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAX-RS(泽西岛)ExceptionMapper - @Context 注入静态/单例类 - 它有效,但为什么呢? 的相关文章

随机推荐

  • 如何使用 numpy 获取所有可能的随机组合

    我有一个长度为 NumPy 的数组N含有X那些和N X零 我想生成数组的所有可能的随机组合 例如 当N是 5 并且X是2 我需要以下组合 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0
  • 从服务器打开文件并发送到浏览器

    在我的 asp net 应用程序中 我创建 pdf 文件并将其保存在服务器上的 App Data 文件夹中 接下来我想打开这个文件以便用户可以打印它 如何在浏览器中打开该文件 在http header 等中发送 有人有一些例子吗 请帮忙 您
  • php中的隐式类变量声明?

    我一直在查看一些代码 并且很难在 php 类中解决变量声明 具体来说 我正在查看的代码在使用类变量之前似乎没有声明它们 现在这可能是预料之中的 但我找不到任何表明这是可能的信息 那么你会期望这样吗 class Example public
  • 使用 MSDeploy 将可执行文件复制到服务器,然后运行它

    我已经使用 MSDeploy WebDeploy 来更新我的 Web 应用程序 这解决了我迄今为止设置的大约 90 的部署问题 此外 我想做的是将可执行文件 实际上是文件夹的内容 复制到服务器 然后运行该可执行文件 这会更新架构 我可以看到
  • Openstreetmap 反向地理编码

    有谁知道有哪些开源项目允许对 Open StreetMap 数据进行反向地理编码查找 我不想使用现有的托管网络服务 例如提名 https wiki openstreetmap org wiki Nominatim因为我的数据集很大 您可以安
  • OnClick() 事件和 OnClickListener 之间的区别?

    我一直在用onclick 我的大多数项目中都有这样的事件 但是 我读到OnClickListener 谁能说出这两者有什么区别 哪一个最适合在 Android 应用程序中使用 我不确定这个问题是否清楚 View OnClickListene
  • Android/PhoneGap:在插件开发中使用第三方库

    我正在开发一个 PhoneGap Cordova 插件 该插件应该提供一个用于发送和接收 OSC 消息 开放声音控制 的套接字 为此 我想使用JavaOSC http www illposed com software javaoscdoc
  • 如何在首选项中使用 QuietlyCoding 的 NumberPicker?

    我正在尝试使用 QuietlyCoding NumberPicker 因为我还没有找到其他的 但我无法让它工作 我将库作为项目导入 然后将其添加到我的项目中 偏好活动 public class MainPrefs extends Prefe
  • 如何制作以编程方式使用 UISplitViewController 和 UINavigationController 的通用 iPhone / iPad 应用程序?

    我在任何地方都找不到一个好的答案 我正在为我的 iPhone 应用程序使用 UINavigationController 所有内容都是以编程方式生成的 界面生成器中没有任何内容 我正在尝试使用 UISplitViewController 和
  • AWS Elastic Beanstalk 多容器 Docker 配置上的 HTTPS/SSL 问题

    我有这个 Multidocker 配置 我的 HTTP 流量工作正常 没有任何问题 但是 每次我尝试使用 https 时都会收到 408 AWSEBDockerrunVersion 2 containerDefinitions name u
  • 如何解析ajax返回的JSON字符串列表?

    我有一个简单的 ajax 调用 它返回一个序列化的字符串列表 这太棒了 我可以取回数据 不过 我只是尝试对列表中的每个项目执行警报 但是 我只是不断从列表中取回单个字符 例如 如果它返回一个列表 其中包含一项名为 Hello 的项目 它会提
  • SFML 2.0 – 使用精灵矢量绘图

    我试图创建一个循环在屏幕上绘制 10 个块 但没有显示任何内容 我没有收到错误 所以我认为向量没有存储精灵 我是 SFML 的新手 所以我真的不知道我做错了什么 sf Texture bTexture sf Texture bloqueTe
  • 如何用 clang 构建 clang?

    我已经用 MSVC 和 MinGW 成功构建了 clang 3 2 但我认为这不是 纯粹 的叮当声 那么有人可以给我一些关于如何使用 clang 构建 clang Windows Linux 的说明或材料吗 我们可以独立使用 clang 不
  • 删除lastSuccessful/lastStable jenkins时出现java.nio.file.DirectoryNotEmptyException

    运行jenkins作业时 控制台报此错误 java nio file DirectoryNotEmptyException C jenkins jobs My Job lastSuccessful at sun nio fs Windows
  • Visual Studio 2019 (16.2.1) 不再具有支持 .net core 预发行版本的复选框

    在 Visual Studio v16 2 1 中 不再有用于在预发布中包含 net core 版本的按钮 升级到此版本后 我无法构建 net core 3 Preview 7 项目 For Net Core 3 0 预览版 使用 Visu
  • 如何在 PowerShell 中通过 splatting 将开关参数作为变量传递?

    如果您有多个参数在调用命令或脚本时需要一个值 我知道您可以像这样传递它 parameters name John last name Doe 但如果命令或脚本实际上只是期望 T指示类似标志的内容 但参数本身不需要值 我如何将其设置在变量中
  • ActiveRecord 回调列表

    我已经浏览 Rails 源代码有一段时间了 我认为没有更好的方法来获取列表all除以下回调之外的回调 ActiveRecord Callbacks CALLBACKS 这是一个常量列表 意思是如果您使用像 devise invitable
  • sqlite 表中的最大行数

    给出一个简单的 sqlite3 表 create table data key PRIMARY KEY value 键大小为 256 字节 值大小为 4096 字节 该 sqlite3 表中的最大行数限制 忽略磁盘空间限制 是多少 它们的限
  • Bugzilla Rest api 激活

    我在 Fedora 服务器上安装了 Bugzilla 我想使用 Rest Api 但找不到如何激活它 有人能帮我吗 这个问题可以通过安装一些列为可选的 Perl 模块来解决 对我有用的是启用 mod rewrite 并安装与 Bugzill
  • JAX-RS(泽西岛)ExceptionMapper - @Context 注入静态/单例类 - 它有效,但为什么呢?

    我有一个单实例类 实现 ExceptionMapper 它不是一个静态类 但我知道它只创建了一个实例 我检查过 构造函数仅被调用一次 我的班级使用 Context HttpServletRequest 我可以清楚地观察到 当我的Except