перенести осевой мыльный веб-сервис в spring ws - значения объекта RequestPayload, равные нулю в методе конечной точки - PullRequest
0 голосов
/ 29 мая 2019

Работа со старым wsdl file, сгенерированным с помощью AXIS, чтобы он работал с пружиной ws.После некоторых настроек я мог сгенерировать исходники java со старым wsdl.

Теперь я пытаюсь сделать запрос из soap UI, но значения запроса отображаются как нулевые в endpoint method.Запрос приходит в backend правильно, но не values.

WSDL-файл

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:onl="http://online.mysite.com">
   <soapenv:Header/>
   <soapenv:Body>
      <onl:getSummary soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <in0 xsi:type="onl:SummaryObject">
            <docid xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">doc123</docid>
            <amount xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</amount>
            <duenew xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</duenew>
            <reference xsi:type="xsd:long">?</reference>
            <sortBy xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</sortBy>
            <startDate xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</startDate>
         </in0>
      </onl:getSummary>
   </soapenv:Body>
</soapenv:Envelope>

Запрос на мыло:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:onl="http://online.mysite.com">
   <soapenv:Header/>
   <soapenv:Body>
      <onl:getSummary soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <in0 xsi:type="onl:SummaryObject">
            <docid xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">doc123</docid>
            <amount xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</amount>
            <duenew xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</duenew>
            <reference xsi:type="xsd:long">121212121</reference>
            <sortBy xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</sortBy>
            <startDate xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</startDate>
            <visibility xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">?</visibility>
         </in0>
      </onl:getSummary>
   </soapenv:Body>
</soapenv:Envelope>

Метод конечной точки:

@PayloadRoot(namespace = NAMESPACE_URI, localPart ="getSummary")
    @ResponsePayload
    public JAXBElement<EObjects> getSummary(@RequestPayload SummaryObject summaryObject) {

            System.out.println("Am done with this"+summaryObject.getDocId());
        ObjectFactory factory = new ObjectFactory();
        EObjects objects = factory.createEObjects();
        QName qname = new QName("http://online.mysite.com", "eobjects");
        return new JAXBElement(qname, EObjects.class, objects);

    }

1 Ответ

0 голосов
/ 19 июня 2019

WSDL, сгенерированный в axis 1, больше не поддерживается spring ws or CXF. Таким образом, сгенерированные Java-классы из WSDL не будут иметь необходимой информации, необходимой для unmarshelling запроса JAXB в spring. Таким образом, request объект придет как null.

Я сделал работу, в которой есть 2 вещи, которые нужно сделать

  1. Добавьте аннотацию корневого элемента xml поверх класса объекта запроса, сгенерированного из WSDL.

@ XmlRootElement (name = "getSomething", пространство имен = «http://yoursite.com")

  1. вручную демонтировать объект запроса, как показано ниже:

код

SoapMessage message = (SoapMessage) messageContext.getRequest();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            message.writeTo(out);
            String strMsg = new String(out.toByteArray());  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document d = db.parse(new InputSource(new StringReader(strMsg)));
 Node getrequestObject = d.getElementsByTagName("yourtag").item(0);

JAXBContext jc = JAXBContext.newInstance(MyRequestObject.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    JAXBElement<SummaryObject> je = unmarshaller.unmarshal(new
DOMSource(getrequestObject), MyRequestObject.class);
...