Spring-WS:如何提取 Soap 消息正文
Spring-WS : How to extract Soap Message Body
我正在尝试从 spring-ws 应用程序中的 soap 请求中提取 soap 主体。我的香皂要求是
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org /soap/envelope/" xmlns:sch="http://www.manager.cts.com/schema">
<soapenv:Header/>
<soapenv:Body>
<sch:addManagerRequest>
<sch:name>shivani</sch:name>
<sch:salary>1231231</sch:salary>
<sch:developer>
<sch:firstName>asd</sch:firstName>
<sch:lastName>asdasd</sch:lastName>
<sch:salary>123123</sch:salary>
</sch:developer>
</sch:addManagerRequest>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用以下代码提取皂体:
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
SoapMessage message = (SoapMessage) messageContext.getRequest();
SoapBody soapBody = message.getSoapBody();
Source bodySource = soapBody.getSource();
DOMSource bodyDomSource = (DOMSource) bodySource;
Node bodyNode = bodyDomSource.getNode();
System.out.println(bodyNode.getNodeValue());
System.out.println(bodyNode.getChildNodes());
}
输出为:
null
[soapenv:Body: null]
请帮我解决这个问题。我是 spring-ws
的新手
最好的解决方案是使用 Jaxb unmarshal() 方法。您的 java 映射文件应该有正确的注释:-
示例:
@XmlRootElement(name = "name_of_request")
public class Request {
@XmlElement(required = true) // add this annotation for each field value
protected String test;
//other fields + getter and setter
正确映射文件后,使用 jaxb 为您解组对象:-
SoapMessage message = (SoapMessage) messageContext.getRequest();
SoapBody soapBody = message.getSoapBody();
Source bodySource = soapBody.getPayloadSource();
DOMSource bodyDomSource = (DOMSource) bodySource;
JAXBContext context = JAXBContext.newInstance(Request.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Request request = (Request) unmarshaller.unmarshal(bodyDomSource);
// populate request object.
我正在尝试从 spring-ws 应用程序中的 soap 请求中提取 soap 主体。我的香皂要求是
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org /soap/envelope/" xmlns:sch="http://www.manager.cts.com/schema">
<soapenv:Header/>
<soapenv:Body>
<sch:addManagerRequest>
<sch:name>shivani</sch:name>
<sch:salary>1231231</sch:salary>
<sch:developer>
<sch:firstName>asd</sch:firstName>
<sch:lastName>asdasd</sch:lastName>
<sch:salary>123123</sch:salary>
</sch:developer>
</sch:addManagerRequest>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用以下代码提取皂体:
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
SoapMessage message = (SoapMessage) messageContext.getRequest();
SoapBody soapBody = message.getSoapBody();
Source bodySource = soapBody.getSource();
DOMSource bodyDomSource = (DOMSource) bodySource;
Node bodyNode = bodyDomSource.getNode();
System.out.println(bodyNode.getNodeValue());
System.out.println(bodyNode.getChildNodes());
}
输出为:
null
[soapenv:Body: null]
请帮我解决这个问题。我是 spring-ws
的新手最好的解决方案是使用 Jaxb unmarshal() 方法。您的 java 映射文件应该有正确的注释:- 示例:
@XmlRootElement(name = "name_of_request")
public class Request {
@XmlElement(required = true) // add this annotation for each field value
protected String test;
//other fields + getter and setter
正确映射文件后,使用 jaxb 为您解组对象:-
SoapMessage message = (SoapMessage) messageContext.getRequest();
SoapBody soapBody = message.getSoapBody();
Source bodySource = soapBody.getPayloadSource();
DOMSource bodyDomSource = (DOMSource) bodySource;
JAXBContext context = JAXBContext.newInstance(Request.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Request request = (Request) unmarshaller.unmarshal(bodyDomSource);
// populate request object.