0

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

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

4

2 回答 2

0

使用@Action 和回复地址 - 我假设它是 WS-Addressing 参数。不知道你是如何让 MessageContext 为空的。我之前曾经遇到过类似的情况(但无法从 Endpoint 方法访问 MessageContext )。

我按照本网站中提到的步骤从任何地方访问 Spring WS MessageContext

一旦 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());   
        }
于 2013-09-20T14:06:15.507 回答
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>

并且您的目标是在 web 服务的端点方法中获取值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

于 2015-09-15T05:58:13.500 回答