如何使用Springs在Endpoint方法中解析SOAP标头

时间:2013-09-19 05:23:30

标签: spring soap

我正在使用Springs 3.我在Endpoint类中有一个处理Web服务请求的方法。该方法使用@Action注释以使其异步。 SOAP请求标头包含一些信息(如UUID,回复地址等)。我需要能够从这个方法中访问这些头信息。

Spring WS MessageContext以及Apache轴MessageContext似乎是空的,所以我无法在方法中使用它来派生SOAP头。

2 个答案:

答案 0 :(得分:0)

使用@Action和Reply Address - 我假设它是WS-Addressing参数。 不确定你如何让MessageContext为null。我之前曾遇到类似的情况(但无法从Endpoint方法访问MessageContext)。

我按照本网站Access Spring WS MessageContext from anywhere中提到的步骤进行了操作。

一旦检索到MessageContext(希望不为空),可以通过类似的方式轻松访问所述参数

SoapMessage sm = (SoapMessage) mc.getRequest();
Iterator<SoapHeaderElement> iter = sm.getEnvelope().getHeader().examineAllHeaderElements();
        while (iter.hasNext()) {
            SoapHeaderElement she = iter.next();
            log.info("\n"+she.getName().getLocalPart()+ " - "+she.getText());   
        }

答案 1 :(得分:0)

为此,您可以使用解组来获取标头变量。 假设你有一个像这样的标题

<soapenv:Header>
  <v2:XHeader>
     <v2:name>xxx</v2:srvcName>
     <v2:version>1.0</v2:srvcVersion>
     <v2:sender>yyy</v2:senderApp>
   </v2:XHeader>
</soapenv:Header>

并且你的目标是在webservice的端点方法中获取值 xxx,1.0,yyy 。为此你需要做的是,创建一个类,说它的名字是 MyHeader.java 以便我们将传入的标头值解组为此类。此类看起来像

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "XHeader", propOrder = {
    "name",
    "version",
    "sender" 
})
@XmlRootElement(name = "XHeader")
public class MyHeader {

    @XmlElement(required = true)
    protected String name;
    @XmlElement(required = true)
    protected String version;
    @XmlElement(required = true)
    protected String sender; 


   public String getName() {
        return name;
    }
   public void setName(String value) {
        this.name = value;
    }

     public String getVersion() {
        return version;
    }
   public void setVersion(String value) {
        this.version = value;
    }
 public String getSender() {
        return sender;
    }
   public void setSnder(String value) {
        this.sender = value;
    }


}

这里我做的是,我们创建了一个java类,并用

注释它
@XmlRootElement(name = "XHeader")

这样我们就知道xml的根元素应该是 XHeader 。 同样创建了三个变量并用

注释
@XmlElement(required = true)

。现在要做的是在端点方法中,你创建一个像

这样的jaxbcontext对象
 JAXBContext jaxbContext = JAXBContext.newInstance(MyHeaderType.class);
    SoapMessage requestMessage = (SoapMessage) messageContext.getRequest();
    SoapHeader reqheader = requestMessage.getSoapHeader();
    Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements();
            while (itr.hasNext()) {
                SoapHeaderElement ele = itr.next();

                MyHeaderType headerType=(MyHeaderType)jaxbContext.createUnmarshaller().unmarshal(ele.getSource());
                 System.out.println(esbHeaderType.getName());
                 System.out.println(esbHeaderType.getVersion());
                 System.out.println(esbHeaderType.getSender());
            }

。现在它将打印值 xxx,1.0,yyy