Я создал простое приложение на основе WebFlux, где у меня есть определение сервиса .wsdl, которым я хочу притвориться, добавил задачу genJaxb
Gradle для построения Java классов из этого WSDL, добавил Веб-конфигурация, где я регистрирую Jaxb2XmlDecoder
, и у меня есть контроллер следующим образом:
@Controller
public class MyResource {
@PostMapping
public Mono<MyResponse> printParcel(@RequestBody MyRequest request) {
return Mono.just(new MyResponse());
}
}
И я выполняю запрос как curl localhost:8080/ --header "Content-Type: text/xml; charset=utf-8" -d @MyRequest.xml
, тогда как MyRequest.xml
:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<ns2:Authentication xmlns:ns2="http://some.uri">
<ns2:Culture>en-US</ns2:Culture>
</ns2:Authentication>
<ns3:Audit xmlns:ns3="http://some.other.uri">
<ns3:CorrelationID>UUID</ns3:CorrelationID>
<ns3:BusinessKeys> </ns3:BusinessKeys>
</ns3:Audit>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns2:MyRequest xmlns:ns2="http://some.uri"
<ns2:InputParameters>
<ns2:ShippingParameter>
<ns2:Name>testName</ns2:Name>
<ns2:Value>testValue</ns2:Value>
</ns2:MyRequest>
</SOAP-ENV:Body>
Итак, когда я выполняю запрос, я (вполне естественно, что) получаю сообщение об ошибке из кода демаршаллинга:
{"timestamp":1582210818002,"path":"/","status":400,"error":"Bad Request","message":"Failed to read HTTP message","requestId":"9a6bc9b9","trace": "org.springframework.core.codec.DecodingException:
Could not unmarshal XML to class kn.internal.pcip.wsdl.dto.PrintParcelRequest; nested exception is javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 1; columnNumber: 79; unexpected element (uri:\"http://schemas.xmlsoap.org/soap/envelope/\", local:\"Envelope\"). Expected elements are <{...}Audit>,<{...}Authentication>,<{...}AuthenticationHeader>,...]\r
at org.springframework.http.codec.xml.Jaxb2XmlDecoder.unmarshal(Jaxb2XmlDecoder.java:218)\r
Однако, если я изменяю тип из RequestBody
аргумента, чтобы быть org.springframework.ws.soap.SoapEnvelope
, у меня совершенно другая, но, тем не менее, обескураживающая ошибка:
"status":415,"error":"Unsupported Media Type","message":"Content type 'text/xml;charset=utf-8' not supported for bodyType=org.springframework.ws.soap.SoapEnvelope"
Я не очень знаком с SOAP или WSDL, поэтому любые предложения, как (если в все возможно) принять (введите безопасно, предпочтительно) SOAP -платежи в WebFlux-окружении
Примечание: я знаю о JAX-WS :) Я просто хочу go с полностью неблокирующим приложением , Спасибо!