我正在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服务实现。此外,此变量的值对于每个请求都必须是唯一的。
答案 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来实现此目的。