繁体   English   中英

(可选)注入ContainerRequestContext

[英]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;
    }

}

处理可选注入的简单方法是@Injectjavax.enterprise.inject.Instance<T> ,然后在instance.isUnsatisfied()之前调用instance.get()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM