Java 如何在ApacheCXF中在soap头和web服务方法之间共享数据

Java 如何在ApacheCXF中在soap头和web服务方法之间共享数据,java,apache,soap,cxf,Java,Apache,Soap,Cxf,我有一个使用ApacheCXF开发的SOAP web服务。web服务将在SOAP头中传递一个参数,我必须传递给web服务方法。如何在web服务方法中获取此参数? 例如,我的web服务方法是getCustomerByName(字符串名)。 请求SOAP头将有一个参数,authentication=ticket。如何在方法中获取此值(票证)。 我尝试了拦截器——它们允许获取标题详细信息,但我应该将其存储在何处,并将其保存在方法体中。我可以设置共享上下文或属性吗?JAX-WS有一个WebService

我有一个使用ApacheCXF开发的SOAP web服务。web服务将在SOAP头中传递一个参数,我必须传递给web服务方法。如何在web服务方法中获取此参数? 例如,我的web服务方法是getCustomerByName(字符串名)。 请求SOAP头将有一个参数,authentication=ticket。如何在方法中获取此值(票证)。
我尝试了拦截器——它们允许获取标题详细信息,但我应该将其存储在何处,并将其保存在方法体中。我可以设置共享上下文或属性吗?

JAX-WS有一个WebServiceContext对象,可以通过@Resource注释注入。从上下文中,您应该能够在拦截器中获取设置到消息中的任何内容

您可以使用PhaseInterceptorChain.getCurrentMessage()获取CXF的当前消息并检索所需的任何内容


您可以将该方法修改为如下内容:getCustomerByName(@WebParam(header=true)String auth,String name)以让CXF传入头。

JAX-WS有一个WebServiceContext对象,可以通过@Resource注释注入。从上下文中,您应该能够在拦截器中获取设置到消息中的任何内容

您可以使用PhaseInterceptorChain.getCurrentMessage()获取CXF的当前消息并检索所需的任何内容


您可以将该方法修改为:getCustomerByName(@webgram(header=true)String auth,String name)以让CXF传入标头。

我这样做了,它成功了:

`Message message = PhaseInterceptorChain.getCurrentMessage();

List<Header> headers = CastUtils.cast((List<?>) message.get(Header.HEADER_LIST));

for(Header hd : headers){
   if (hd!=null){
    //do dom parsing
    Element e = (Element)hd.getObject();
    e.getTextContent());
    }
}`
`Message Message=PhaseInterceptorChain.getCurrentMessage();
List headers=CastUtils.cast((List)message.get(Header.Header_List));
用于(标题hd:标题){
如果(hd!=null){
//进行dom解析
元素e=(元素)hd.getObject();
e、 getTextContent());
}
}`

我这样做了,效果很好:

`Message message = PhaseInterceptorChain.getCurrentMessage();

List<Header> headers = CastUtils.cast((List<?>) message.get(Header.HEADER_LIST));

for(Header hd : headers){
   if (hd!=null){
    //do dom parsing
    Element e = (Element)hd.getObject();
    e.getTextContent());
    }
}`
`Message Message=PhaseInterceptorChain.getCurrentMessage();
List headers=CastUtils.cast((List)message.get(Header.Header_List));
用于(标题hd:标题){
如果(hd!=null){
//进行dom解析
元素e=(元素)hd.getObject();
e、 getTextContent());
}
}`

谢谢,@Daniel。我尝试了WebServiceContext和PhaseInterceptorChain,并且能够读取标题。上述两种方法都是线程安全的吗?我的意思是,每个请求将包含我想要读取的不同票证值。我想是的,因为每个请求都包含自己的消息。我说得对吗?谢谢,丹尼尔。我尝试了WebServiceContext和PhaseInterceptorChain,并且能够读取标题。上述两种方法都是线程安全的吗?我的意思是,每个请求将包含我想要读取的不同票证值。我想是的,因为每个请求都包含自己的消息。我说得对吗?