>我有一段代码可以在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;
}