【发布时间】:2016-04-02 02:13:03
【问题描述】:
我应该将一些带有来自请求的 HTTP 标头的信息传递给 EJB,并且我不想添加参数并将它们传递到我需要它们的任何地方。所以我使用 RequestScoped bean 来保存我的标头值。这个实现可以吗,还是我误解了@RecuestScoped bean 的概念?
首先我使用拦截器 (Resteasy) 获取标头,并将它们保存到我的 request scoped 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 期间。
【问题讨论】:
-
您的测试结果如何?它做你想做的事吗?它是否按您预期的那样工作?
-
测试工作到目前为止...而且我读到的关于 CDI 的所有内容似乎都符合我的计划。我从 ManagedBeans 的(Web)上下文中了解了更多 @RequestScope'd bean,因此在我的场景中使用它感觉不自然。
-
如果一切都按预期工作,并且此解决方案适合您,并且您看到的内容与文档相匹配,那么您不必担心。
标签: java rest jakarta-ee cdi requestscope