我正在使用 Springs 3。我在 Endpoint 类中有一个方法来处理 Web 服务请求。该方法使用@Action 进行注释以使其异步。SOAP 请求标头包含一些信息(如 UUID、回复地址等)。我需要能够从该方法内部访问这些标头信息。
Spring WS MessageContext 以及 Apache 轴 MessageContext 似乎是空的,因此我无法在方法中使用它来派生 SOAP 标头。
使用@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());
}
为此,您可以使用解组来获取标头变量。假设你有这样的标题
<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