从可以在请求外部调用的代码中注入/检查是否存在带有CDI的HttpServletRequest的干净方法



>我有一段代码可以在HTTP请求内部和外部调用,但是如果HttpServletRequest中的信息可用,我想访问它。我的第一次尝试如下:

@Inject
private Instance<HttpServletRequest> httpReq;
void doSomethingIfInRequest(){
  if (httpReq.isUnsatisfied()){
    return;
  }
  httpReq.get()
  // ...
}

但是,即使在请求之外,isUnsatisfied()也会返回false,导致get()抛出org.jboss.weld.exceptions.IllegalStateException: WELD-000710: Cannot inject HttpServletRequest outside of a Servlet request

我可以通过捕获异常或创建另一个保存请求的类来解决此问题,但想知道 CDI/Weld 是否提供了一些东西来处理这个问题。

HttpServletRequest是一个所谓的内置bean。CDI(焊接(为您提供它。它始终存在并被检测到,因此Instance.isUnsatisfied()将被false .

您可以在此处浏览实现(对于 Weld 3(。短篇故事是 - 检查上下文状态(RequestScoped(,并根据结果,你要么得到你的豆子,要么得到你看到的异常。

解决方案 - 最好的方法可能是检查上下文是否处于活动状态,但如果上下文不是,则可能无法避免捕获异常。例如,这可以通过BeanManager来实现:

@Inject
BeanManager bm;
public boolean isReqScopeActive() {
  try {
    return bm.getContext(RequestScoped.class).isActive();
  } catch (ContextNotActiveException e) {
    // this is expected response to bm.getContext() if that context is inactive
    return false;
  }
}

除了 Siliarus 的解决方案之外,下面的代码还可用于检查当前上下文是否为 HttpServletRequestContext。

@Inject
BeanManager bm;
public boolean isHttpRequestScopeIsActive() {
        if (isHttpRequestScopeActive == null) {
            try {
                Context context = bm.getContext(RequestScoped.class);
                isHttpRequestScopeActive = context instanceof HttpRequestContextImpl;
            } catch (ContextNotActiveException e) {
                isHttpRequestScopeActive = false;
            }
        }
        return isHttpRequestScopeActive;
    }

相关内容

最新更新