Apache CXF:将拦截器中的信息转发到实际的Web服务实现

时间:2012-01-24 13:00:13

标签: java jax-ws cxf

我正在JBoss6服务器上运行基于Apache CXF 2.3.1的JAX-WS Web服务。

我的服务提供了getWeight功能。此函数应以不同的单位(千克,磅)返回值,具体取决于SOAP标头中的其他信息。为此我添加了自己的拦截器:

public class MySoapHeaderInterceptor extends AbstractSoapInterceptor
{
    public MySoapHeaderInterceptor()
    {
        super(Phase.USER_PROTOCOL);
    }

    ...
}

拦截工作正常,我可以解析SOAP标头中的附加元素,并可以根据这个元素设置变量:

boolean poundsRequested = true;

现在我的问题出现了。我不知道如何将变量poundsRequested转发到我的实际WebService实现MyServiceImpl。这个类正在调用另一个类ValueReader,我最终需要SOAP头中的信息。

我已经尝试设置全局静态变量ValueReader.poundsRequested。但是这样的解决方案不是线程安全的。可能会发生两个客户端的调用干扰,并且可能会覆盖彼此设置的变量。

总结:我基本上需要有可能将变量从Apache CXF拦截器转发到实际的Web服务实现。此外,此变量的值对于每个请求都必须是唯一的。

2 个答案:

答案 0 :(得分:2)

在拦截器中,您可以保存传入消息所需的值:

message.put("my.value", value);

在您的实施中,您可以执行以下两项操作之一:

1)通过@Resource事件注入标准JAXWS WebServiceContext并调用

context.getMessageContext().get("my.value");

2)因为你还是与CXF联系在一起,所以:

PhaseInterceptorChain.getCurrentMessage().get("my.value");

答案 1 :(得分:0)

理想情况下,请求权重的格式应该是有效负载的一部分 - 它不适合作为标题。

如果使用JAX-WS(推荐使用CXF),您可能不需要拦截器来获取此标头,您可以使用@WebParam注释并将header属性设置为true来实现此目的。