Spring WebServiceTemplate 的 marshalSendAndReceive 方法在发送请求时将 SOAP header 作为 null 发送
Spring WebServiceTemplate's marshalSendAndReceive method sends SOAP header as null when sending Request
我正在 java.My 中开发 SOAP 客户端 SOAPRequest 如下:
SOAP 请求
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://myWs.com/com" xmlns:re="http://myWs.com/myAlert">
<soapenv:Header>
<com:MYHeader>
<com:Auth>
<com:MyID>1312</com:MyID>
<com:Pwd>test213</com:Pwd>
</com:Auth>
</com:MYHeader>
</soapenv:Header>
<soapenv:Body>
<re:MyRequest>
<re:MyOrder>
<re:MyItems>
<re:ItemCode>TEST</re:ItemCode>
<re:ItemName>TEST</re:ItemName>
<re:ItemRef>TEST</re:ItemRef>
</re:MyItems>
</re:MyOrder>
</re:MyRequest>
</soapenv:Body>
</soapenv:Envelope>
我使用 Spring Framework 的 WebServiceTemplate 来使用 SOAPService.But 当我尝试它时我发现请求 object 是 body 部分去 perfectly.But header 部分如下所示 null.My SOAP 客户端:
SOAP 客户端:
public Object callWebService(MyRequest request){
MyResponse myObj = (MyResponse)getWebServiceTemplate().marshalSendAndReceive("http://localhost:9000/MyServices/ws/soap/MyService", request,new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SoapMessage soapMessage = (SoapMessage)message;
SoapHeader header = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<MYHeader>\n<Auth>\n<MyID>1312</MyID>\n<Pwd>test213</Pwd>\n</Auth>\n</MYHeader>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, header.getResult());
} catch (Exception e) {
System.out.println("ERROR : "+e);
}
}
});
MyResponse response= (MyResponse) myObj;
return myObj;
}
在上面的 "request" 中有 SOAPRequest.Kindly 的 body 部分让我提前知道我缺少什么 here.Thanks
我能够弄清楚 issue.I 能够使用 JAXBContext 添加 header 以实现添加 header.I 修改了我在 [=20] 中给出的代码=] here,它像 gem.I 一样工作,我给出下面的代码供参考:
代码
public Object callWebService(MyRequest request){
MyResponse myObj = (MyResponse)getWebServiceTemplate().marshalSendAndReceive("http://localhost:9000/MyServices/ws/soap/MyService", request,new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
// create the header element
ObjectFactory factory = new ObjectFactory();
MYHeader headerType = factory.createMYHeader();
Auth authType = new Auth();
authType.setMyID("1010");
authType.setPwd("myPwd");
headerType.setAuth(authType);
JAXBElement<MYHeader> headers =
factory.createMYHeader(headerType);
// create a marshaller
JAXBContext context = JAXBContext.newInstance(MYHeader.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(headers, soapHeader.getResult());
} catch (Exception e) {
System.out.println("ERROR : "+e);
}
}
});
MyResponse response= (MyResponse) myObj;
return myObj;
}
在我看来,使用 SAAJSoapMessage 更简单、更简洁。这是 doWithMessage 示例方法代码。让我知道你的想法!!
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.xml.transform.StringSource;
public void doWithMessage(WebServiceMessage message) {
if (message instanceof SaajSoapMessage) {
try {
SaajSoapMessage soapMessage = (SaajSoapMessage) message;
SoapHeader soapHeader = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<MYHeader>\n<Auth>\n<MyID>1312</MyID>\n<Pwd>test213</Pwd>\n</Auth>\n</MYHeader>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, soapHeader.getResult());
} catch (TransformerFactoryConfigurationError | TransformerException e) {
logger.error(e.getMessage(), e);
}
}
}
我正在 java.My 中开发 SOAP 客户端 SOAPRequest 如下:
SOAP 请求
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://myWs.com/com" xmlns:re="http://myWs.com/myAlert">
<soapenv:Header>
<com:MYHeader>
<com:Auth>
<com:MyID>1312</com:MyID>
<com:Pwd>test213</com:Pwd>
</com:Auth>
</com:MYHeader>
</soapenv:Header>
<soapenv:Body>
<re:MyRequest>
<re:MyOrder>
<re:MyItems>
<re:ItemCode>TEST</re:ItemCode>
<re:ItemName>TEST</re:ItemName>
<re:ItemRef>TEST</re:ItemRef>
</re:MyItems>
</re:MyOrder>
</re:MyRequest>
</soapenv:Body>
</soapenv:Envelope>
我使用 Spring Framework 的 WebServiceTemplate 来使用 SOAPService.But 当我尝试它时我发现请求 object 是 body 部分去 perfectly.But header 部分如下所示 null.My SOAP 客户端:
SOAP 客户端:
public Object callWebService(MyRequest request){
MyResponse myObj = (MyResponse)getWebServiceTemplate().marshalSendAndReceive("http://localhost:9000/MyServices/ws/soap/MyService", request,new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SoapMessage soapMessage = (SoapMessage)message;
SoapHeader header = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<MYHeader>\n<Auth>\n<MyID>1312</MyID>\n<Pwd>test213</Pwd>\n</Auth>\n</MYHeader>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, header.getResult());
} catch (Exception e) {
System.out.println("ERROR : "+e);
}
}
});
MyResponse response= (MyResponse) myObj;
return myObj;
}
在上面的 "request" 中有 SOAPRequest.Kindly 的 body 部分让我提前知道我缺少什么 here.Thanks
我能够弄清楚 issue.I 能够使用 JAXBContext 添加 header 以实现添加 header.I 修改了我在 [=20] 中给出的代码=] here,它像 gem.I 一样工作,我给出下面的代码供参考:
代码
public Object callWebService(MyRequest request){
MyResponse myObj = (MyResponse)getWebServiceTemplate().marshalSendAndReceive("http://localhost:9000/MyServices/ws/soap/MyService", request,new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
// create the header element
ObjectFactory factory = new ObjectFactory();
MYHeader headerType = factory.createMYHeader();
Auth authType = new Auth();
authType.setMyID("1010");
authType.setPwd("myPwd");
headerType.setAuth(authType);
JAXBElement<MYHeader> headers =
factory.createMYHeader(headerType);
// create a marshaller
JAXBContext context = JAXBContext.newInstance(MYHeader.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(headers, soapHeader.getResult());
} catch (Exception e) {
System.out.println("ERROR : "+e);
}
}
});
MyResponse response= (MyResponse) myObj;
return myObj;
}
在我看来,使用 SAAJSoapMessage 更简单、更简洁。这是 doWithMessage 示例方法代码。让我知道你的想法!!
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.xml.transform.StringSource;
public void doWithMessage(WebServiceMessage message) {
if (message instanceof SaajSoapMessage) {
try {
SaajSoapMessage soapMessage = (SaajSoapMessage) message;
SoapHeader soapHeader = soapMessage.getSoapHeader();
StringSource headerSource = new StringSource("<MYHeader>\n<Auth>\n<MyID>1312</MyID>\n<Pwd>test213</Pwd>\n</Auth>\n</MYHeader>");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, soapHeader.getResult());
} catch (TransformerFactoryConfigurationError | TransformerException e) {
logger.error(e.getMessage(), e);
}
}
}