我有一个单实例类,实现 ExceptionMapper。它不是一个静态类,但它是一个我知道只创建单个实例的类(我检查过 - 构造函数只被调用一次)。
我的班级使用@Context HttpServletRequest,我可以清楚地观察到,当我的ExceptionMapper.toResponse()方法被调用时,@Context 'request'参数的值与引发异常的请求相关。
文档说 这确实是设计支持的功能,并且它是通过使用“代理”完成的。
我想知道这是如何实现的——单个实例如何同时具有不同的成员变量值?
谢谢你,
AG
PS:这是测试代码:
@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