Метод Spring WebServiceTemplate marshalSendAndReceive отправляет заголовок SOAP как ноль при отправке запроса - PullRequest
3 голосов
/ 02 июля 2019

Я разрабатываю клиент SOAP в java. Мой запрос SOAP приведен ниже:

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>

Я использую WebServiceTemplate Spring Framework для использования SOAPService. Но когда я пытаюсь это сделать, я обнаруживаю, что объект запроса, который является разделом тела, работает отлично. Но раздел заголовка идет как нуль. Мой SOAP-клиент приведен ниже:

SOAPClient:

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;
}

В вышеприведенном «запросе» есть раздел тела SOAPRequest. Пожалуйста, дайте мне знать, что мне здесь не хватает. Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

На мой взгляд, использование 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);
        }
    }
}
2 голосов
/ 09 июля 2019

Мне удалось выяснить проблему. Я смог добавить заголовок, используя JAXBContext, чтобы добиться добавления заголовка. Я изменил свой код, как указано в ссылке здесь , и он работал какгем. Я даю код ниже для справки:

Код

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...