Как принять SOAP Полезная нагрузка в контроллере WebFlux? - PullRequest
0 голосов
/ 20 февраля 2020

Я создал простое приложение на основе 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 с полностью неблокирующим приложением , Спасибо!

...