gpt4 book ai didi

jakarta-ee - 从可以在请求外调用的代码中使用 CDI 注入(inject)/检查是否存在 HttpServletRequest 的干净方法?

转载 作者:行者123 更新时间:2023-12-05 05:17:19 24 4
gpt4 key购买 nike

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

@Inject
private Instance<HttpServletRequest> httpReq;

void doSomethingIfInRequest(){
if (httpReq.isUnsatisfied()){
return;
}
httpReq.get()
// ...
}

然而,即使在请求之外,isUn​​satisfied() 也会返回 false,导致 get() 抛出 org.jboss。 weld.exceptions.IllegalStateException:WELD-000710:无法在 Servlet 请求之外注入(inject) HttpServletRequest

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

最佳答案

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

您可以浏览一下实现(对于 Weld 3)here .简短的故事是 - 上下文状态 (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;
}
}

关于jakarta-ee - 从可以在请求外调用的代码中使用 CDI 注入(inject)/检查是否存在 HttpServletRequest 的干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com