Java apachecxf:将信息从拦截器转发到实际的webservice实现

Java apachecxf:将信息从拦截器转发到实际的webservice实现,java,jax-ws,cxf,Java,Jax Ws,Cxf,我正在JBoss6服务器上运行一个基于ApacheCXF2.3.1的JAX-WSWeb服务 我的服务提供了一个功能getWeight。此函数应根据SOAP标头中的附加信息以不同单位(千克、磅)返回值。为此,我添加了自己的拦截器: public class MySoapHeaderInterceptor extends AbstractSoapInterceptor { public MySoapHeaderInterceptor() { super(Phase.U

我正在JBoss6服务器上运行一个基于ApacheCXF2.3.1的JAX-WSWeb服务

我的服务提供了一个功能
getWeight
。此函数应根据SOAP标头中的附加信息以不同单位(千克、磅)返回值。为此,我添加了自己的拦截器:

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

    ...
}
拦截工作正常,我可以解析SOAP头中的附加元素,并可以基于此元素设置一个变量:

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

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


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

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


您可能不需要拦截器来获取此标头,如果您使用JAX-WS(建议与CXF一起使用),您可以使用标头属性设置为true的注释来获取此标头。

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

message.put("my.value", value); message.put(“my.value”,value); 在实现中,您可以执行以下两项操作之一:

1) 通过@Resource东西和调用注入标准的JAXWS-WebServiceContext

context.getMessageContext().get("my.value"); context.getMessageContext().get(“my.value”); 2) 由于您仍然与CXF绑定,请执行以下操作:

PhaseInterceptorChain.getCurrentMessage().get("my.value"); PhaseInterceptorChain.getCurrentMessage().get(“my.value”);
Waitaminute…您正在标头中传递真正的功能信息?是的,在标头中设置这些信息可能不是最好的,但由于其他一些原因,我不得不采用这种方法。还有一些在SOAP头中传递的其他信息,在这里我面临同样的问题。为了方便我的工作,我推荐了他们。我不想使用@WebParam符号。这将更改WSDL中函数的签名。标题中的额外元素应该是可选的。谢谢Daniel。你的帖子对我帮助很大!我选择了选项1。基本上我以前已经读过这个想法。我只是在实现过程中遇到了一些其他问题,这使得我很难应用这个想法。好吧,我终于重组了我的实现:)