Jakarta ee 使用CDI从可在请求外部调用的代码注入/检查HttpServletRequest是否存在的干净方法?
我有一段代码,可以在HTTP请求内部和外部调用,但是如果可以的话,我希望访问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 私有实
@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;
}
啊,我刚刚在某处发现了几乎相同的问题,并且得出了相同的结论-