[英]Spring Jersey to inject ContainerRequestContext on request scoped class
[英]Optionally inject ContainerRequestContext
在我的Jersey应用程序中,我想将ContainerRequestContext
实例注入到各种对象中。 如果在请求上下文之外创建对象,则希望注入null。
我注意到HK2有一个@Optional
批注,您可以使用它来注释依赖项,我希望这样做可以完成此工作,但是不幸的是,它根本没有改变行为。
public class MyObject {
private final ContainerRequestContext containerRequestContext;
@Inject
public MyObject(@Optional ContainerRequestContext containerRequestContext) {
this.containerRequestContext = containerRequestContext;
}
}
如果在请求范围之外实例化该对象(在我的情况下,是由Quartz调度程序运行的Job),则将抛出类似这样的异常:
java.lang.IllegalStateException: Not inside a request scope.
如果Jersey在请求范围之外时仅注入null,这将大大简化我的代码,有什么主意怎么做?
我已经找到了一种解决方法,但这基本上是一种技巧。 相反,具有ContainerRequestContext
注入,可以改为尝试明确地得到ContainerRequestContext
从实例ServiceLocator
,并处理异常时的背景是一个请求范围之外。
public class MyObject {
private final Optional<ContainerRequestContext> containerRequestContext;
@Inject
public MyObject(ServiceLocator serviceLocator) {
this.containerRequestContext = getContainerRequestContext(serviceLocator);
}
private Optional<ContainerRequestContext> getContainerRequestContext(ServiceLocator serviceLocator) {
try {
return Optional.of(serviceLocator.getService(ContainerRequestContext.class));
} catch (MultiException e) {
if (e.getCause() instanceof IllegalStateException) {
return Optional.empty();
} else {
throw new ExceptionInInitializerError(e);
}
}
}
}
然后可以更进一步,创建自己的OptionalContainerRequestContext
类型。
public class OptionalContainerRequestContext {
private final Optional<ContainerRequestContext> containerRequestContext;
@Inject
public OptionalContainerRequestContext(ServiceLocator serviceLocator) {
this.containerRequestContext = getContainerRequestContext(serviceLocator);
}
public ContainerRequestContext get() {
return containerRequestContext.get();
}
public boolean isPresent() {
return containerRequestContext.isPresent();
}
private Optional<ContainerRequestContext> getContainerRequestContext(ServiceLocator serviceLocator) {
try {
return Optional.of(serviceLocator.getService(ContainerRequestContext.class));
} catch (MultiException e) {
if (e.getCause() instanceof IllegalStateException) {
return Optional.empty();
} else {
throw new ExceptionInInitializerError(e);
}
}
}
}
然后可以绑定它:
bind(OptionalContainerRequestContext.class).to(OptionalContainerRequestContext.class);
然后根据需要将其注入:
public class MyObject {
private final OptionalContainerRequestContext optionalContainerRequestContext;
@Inject
public MyObject(OptionalContainerRequestContext optionalContainerRequestContext) {
this.optionalContainerRequestContext = optionalContainerRequestContext;
}
}
处理可选注入的简单方法是@Inject
到javax.enterprise.inject.Instance<T>
,然后在instance.isUnsatisfied()
之前调用instance.get()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.