我正在使用Springs 3.我在Endpoint类中有一个处理Web服务请求的方法。该方法使用@Action注释以使其异步。 SOAP请求标头包含一些信息(如UUID,回复地址等)。我需要能够从这个方法中访问这些头信息。
Spring WS MessageContext以及Apache轴MessageContext似乎是空的,所以我无法在方法中使用它来派生SOAP头。
答案 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