我有一些代码将在 Jersey 请求上下文内部和 Jersey 请求上下文外部(在另一个线程中)运行。在这两种情况下,我都有一段数据是可选的,但我需要知道我是否可以从中提取它。
在 Jersey 请求上下文中,它来自标头参数。我正在使用
org.glassfish.hk2.api.ServiceLocator
访问 javax.ws.rs.container.ContainerRequestContext
从中我可以阅读标题。但是,这是可选的,因此它可能存在也可能不存在。在 Jersey 请求上下文之外,我目前正在使用 MDC 来存储和读取值,但同样,它是可选的。 (为了在两者之间传递价值,我在 temporal 上下文中使用。)所有这些东西都有效。
我想知道从哪里提取价值,请求上下文或 MDC。
我知道,如果我尝试访问泽西岛
ContainerRequestContext
之外的 org.glassfish.jersey.process.internal.RequestScope
并且它是 null
我不在请求范围内,应该使用 MDC。但是,我收到了无法抑制的警告。 IllegalStateException
被抛出 并在服务定位器中记录为警告(我无法将其静音)。
一个选项是在 MDC 中存储一个非可选的哨兵值,因为它总是可用的。当我使用临时存储可选值时,我可以设置一个哨兵。如果哨兵存在,则使用 MDC,如果不存在,则使用请求上下文。
我认为我希望工作的一种更简洁的方法只是检查我是否在球衣的请求范围内。但是,我找不到使用
RequestScope
或 ServiceLocator
的方法。有谁知道怎么做?
您可以注册一个调用您的代码的
ApplicationEventListener
,例如,
public class MyAppEventListener implements ApplicationEventListener {
@Override
public RequestEventListener onRequest(final RequestEvent event) {
return new MyRequestListener();
}
public static class MyRequestListener implements RequestEventListener {
@Override
public void onEvent(final RequestEvent event) {
if (event.getType() == RESOURCE_METHOD_START) {
MyOtherCode.youAreNowInRequestScope();
}
}
}
}
然后在您服务的
run()
方法中(我看到您正在使用Dropwizard):
environment.jersey().register(MyAppEventListener.class)
大概你需要调整它来调用非静态的东西或者触发不同的请求事件,但我希望它有用。