Я перехожу с 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? Жду ваших советов!