gpt4 book ai didi

java - 可选择注入(inject) ContainerRequestContext

转载 作者:行者123 更新时间:2023-12-02 05:08:32 25 4
gpt4 key购买 nike

在我的 Jersey 应用程序中,我希望将一个 ContainerRequestContext 实例注入(inject)到各种对象中。如果对象是在请求上下文之外创建的,我希望注入(inject) null。

我注意到 HK2 有一个 @Optional 注释,您可以用它来注释依赖项,我希望这能完成这项工作,不幸的是它根本不会改变行为。

public class MyObject {

private final ContainerRequestContext containerRequestContext;

@Inject
public MyObject(@Optional ContainerRequestContext containerRequestContext) {
this.containerRequestContext = containerRequestContext;
}

}

如果该对象在请求范围之外实例化(在我的例子中,是由 Quartz 调度程序运行的作业),则会抛出如下异常:

java.lang.IllegalStateException: Not inside a request scope.

如果 Jersey 在请求范围之外注入(inject) null,这将大大简化我的代码,有什么想法如何做到这一点吗?

最佳答案

我已经找到了一种方法,但这基本上是一种黑客行为。您可以尝试从 ServiceLocator 显式获取 ContainerRequestContext 实例,并在上下文外部时处理异常,而不是注入(inject) ContainerRequestContext请求范围。

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)它:

bind(OptionalContainerRequestContext.class).to(OptionalContainerRequestContext.class);

然后将其注入(inject)到需要的地方:

public class MyObject {

private final OptionalContainerRequestContext optionalContainerRequestContext;

@Inject
public MyObject(OptionalContainerRequestContext optionalContainerRequestContext) {
this.optionalContainerRequestContext = optionalContainerRequestContext;
}

}

关于java - 可选择注入(inject) ContainerRequestContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com