Как обновить java 8 SOAP вызов до java 11 SOAP вызов с помощью Feign - PullRequest
1 голос
/ 29 апреля 2020

Я перехожу с java 8 на java 11 . У меня есть интеграция со старым стилем SOAP 1.2. Из-за обрезки веб-сервисов JEE из java 11 из javax.xml.ws.Service и вызова super.getPort(new QName(...), SomeWebService.class, someFeatures); из сгенерированных источников у меня больше не работает. Поэтому я решил использовать для этого SOAP вызов OpenFeign https://github.com/OpenFeign/feign#soap, https://github.com/OpenFeign/feign/tree/master/soap

Услуга, которую я хотел бы вызвать:

  • SOAP 1,2 на основе
  • кодировка utf-8
  • Запрос типа контента: приложение / мыло + xml
  • Ответ типа контента: приложение / xop + xml

Вызов, который я хотел бы сделать, выглядит следующим образом: xml:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
      <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
   </soap:Header>
   <soap:Body>
      <ns:Zaloguj>
         <ns:pKluczUzytkownika>theUsersKey</ns:pKluczUzytkownika>
      </ns:Zaloguj>
   </soap:Body>
</soap:Envelope>

То, что я делал с помощью OpenFeign, было интерфейсом для подключения:

import my.domain.schema.cis.bir.publ._2014._07.Zaloguj;
import feign.Headers;
import feign.RequestLine;

public interface MyWebServiceCallInterface {

  @RequestLine("POST /")
  @Headers({
      "SOAPAction: http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj",
      "Content-Type: application/soap+xml"
  })
  String zaloguj(Zaloguj zaloguj);    
}

Класс Zaloguj выглядит следующим образом:

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "pKluczUzytkownika"
})
@XmlRootElement(name = "Zaloguj")
public class Zaloguj {

    @XmlElementRef(name = "pKluczUzytkownika", namespace = "http://CIS/BIR/PUBL/2014/07", type = JAXBElement.class, required = false)
    protected JAXBElement<String> pKluczUzytkownika;


    public JAXBElement<String> getPKluczUzytkownika() {
        return pKluczUzytkownika;
    }

    public void setPKluczUzytkownika(JAXBElement<String> value) {
        this.pKluczUzytkownika = value;
    }

}

, и я реализовал службу с SOAP вызовом:

public ResponseEntity callSOAPService() {     

    JAXBContextFactory jaxbFactory = new JAXBContextFactory.Builder()
        .withMarshallerJAXBEncoding("UTF-8")               .withMarshallerSchemaLocation("https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl")
        .build();

    MyWebServiceCallInterface myWebServiceCallInterface = Feign.builder()
        .encoder(new SOAPEncoder(jaxbFactory))
        .decoder(new SOAPDecoder(jaxbFactory))
        .target(MyWebServiceCallInterface.class, "https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc");

    ObjectFactory objectFactory = new ObjectFactory();
    JAXBElement<String> userKeyElement =objectFactory.createZalogujPKluczUzytkownika("topSecretUserKey");
        Zaloguj zaloguj = new Zaloguj();
    zaloguj1.setPKluczUzytkownika(userKeyElement);

    String result = myWebServiceCallInterface.zaloguj(zaloguj);
}

Но для этого вызова я получил :

feign.FeignException$BadRequest: [400 Bad Request] during [POST] to [https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/] [MyWebServiceCallInterface#zaloguj(Zaloguj)]: []

Я пытался отладить и в Feign SynchronousMethodHandler метод executeAndDecode имеет шаблон поле со значением:

POST / HTTP/1.1
Content-Length: 511
Content-Type: application/soap+xml
SOAPAction: http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj

<?xml version="1.0" encoding="UTF-8" ?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><Zaloguj xmlns="http://CIS/BIR/PUBL/2014/07" xmlns:ns2="http://CIS/BIR/PUBL/2014/07/DataContract" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl"><pKluczUzytkownika>b7e7df92129b4e25aeab</pKluczUzytkownika></Zaloguj></SOAP-ENV:Body></SOAP-ENV:Envelope>

и в Feign ErrorDecoder метод декодировать имеет запрос поле со значением:

POST https://wyszukiwarkaregon.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc/ HTTP/1.1
Content-Length: 511
Content-Type: application/soap+xml
SOAPAction: http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj

<?xml version="1.0" encoding="UTF-8" ?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><Zaloguj xmlns="http://CIS/BIR/PUBL/2014/07" xmlns:ns2="http://CIS/BIR/PUBL/2014/07/DataContract" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl"><pKluczUzytkownika>b7e7df92129b4e25aeab</pKluczUzytkownika></Zaloguj></SOAP-ENV:Body></SOAP-ENV:Envelope>

Может быть, некоторые из вас знают, как это исправить? Что-то не так в моей реализации MyWebServiceCallInterface? Жду ваших советов!

...