3

我应该将一些带有 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 期间。
4

1 回答 1

0

实现是正确的,但使用副作用似乎是不必要的优化。

于 2017-08-26T05:43:12.973 回答