Jakarta ee 使用CDI从可在请求外部调用的代码注入/检查HttpServletRequest是否存在的干净方法?

Jakarta ee 使用CDI从可在请求外部调用的代码注入/检查HttpServletRequest是否存在的干净方法?,jakarta-ee,wildfly,cdi,weld,Jakarta Ee,Wildfly,Cdi,Weld,我有一段代码,可以在HTTP请求内部和外部调用,但是如果可以的话,我希望访问HttpServletRequest中的信息。我的第一次尝试是: @Inject private Instance<HttpServletRequest> httpReq; void doSomethingIfInRequest(){ if (httpReq.isUnsatisfied()){ return; } httpReq.get() // ... } @Inject 私有实

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

@Inject
private Instance<HttpServletRequest> httpReq;

void doSomethingIfInRequest(){
  if (httpReq.isUnsatisfied()){
    return;
  }
  httpReq.get()
  // ...
}
@Inject
私有实例httpReq;
void doSomethingIfInRequest(){
if(httpReq.isUnsatisfied()){
返回;
}
httpReq.get()
// ...
}
但是,即使在请求外部,
isunsatived()
返回
false
,导致
get()
抛出
org.jboss.weld.exceptions.IllegalStateException:weld-000710:无法在Servlet请求外部注入HttpServletRequest


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

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

您可以浏览一下实现(对于Weld 3)。简短的故事是-检查上下文状态(
RequestScoped
),并根据结果,获得bean或看到的异常

解决方案-最好的方法可能是检查上下文是否处于活动状态,但如果不是,您可能无法避免捕获异常。 例如,可以通过
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;

    }

啊,我刚刚在某处发现了几乎相同的问题,并且得出了相同的结论-