[英]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.