我应该将一些带有 HTTP 标头的信息从请求传递到 EJB,并且我不想添加参数并将它们传递到我需要它们的任何地方。所以我使用 RequestScoped bean 来保存我的标头值。这个实现可以吗,还是我误解了@RecuestScoped bean 的概念?
首先,我使用拦截器(Resteasy)获取标头,并将它们保存到我的请求范围bean 中:
@Provider
@ServerInterceptor
public class SomeInterceptor implements PreProcessInterceptor {
@Inject
ApplicationRequestContext appContext;
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod)
throws Failure, WebApplicationException {
List<String> values = request.getHttpHeaders().getRequestHeader("Some-Header");
if(values != null && values.size() > 0) {
appContext.setSomeHeader(values.get(0));
}
return null;
}
}
这是豆子:
@RequestScoped
public class ApplicationRequestContext implements Serializable {
private String someHeader;
public void setSomeHeader(String someHeader) {
this.someHeader = someHeader;
}
public String getSomeHeader() {
return someHeader;
}
}
然后我可以从我的 EJB 访问值(在每个请求中都不同):
@Stateless
public class CheckInWorkflow {
@Inject
ApplicationRequestContext appContext;
public void someEjbMethod() {
doSomethingWithThisHeaderValue(appContext.getSomeHeader());
}
}
根据@RequestScoped的描述,这应该可以按预期工作:
请求范围处于活动状态:
- 在 Web 应用程序中任何 servlet 的 service() 方法期间,在任何 servlet 过滤器的 doFilter() 方法期间以及当容器调用任何 ServletRequestListener 或 AsyncListener 时,
- 在任何 Java EE Web 服务调用期间,
- 在任何 EJB 的任何远程方法调用期间,在任何 EJB 的任何异步方法调用期间,在对 EJB 超时方法的任何调用期间,以及
- 在消息传递到任何 EJB 消息驱动 bean 期间,以及在任何消息传递到从 Java EE 组件环境获得的 JMS 主题或队列的 MessageListener 期间。