繁体   English   中英

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

[英]Apache CXF: Forwarding an information from an interceptor to the actual webservice implementation

我正在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 Interceptor转发到实际的webservice实现。 此外,此变量的值对于每个请求都必须是唯一的。

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

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

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

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

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

2)既然你被绑在CXF上,那么:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM