SOAP响应主体具有没有任何节点的纯文本

jai*_*jai 5 java soap wsdl web-services jaxb

如何处理SOAP消息响应如下?

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="http://foo/bar">
    <S:Header/>
    <S:Body>OK</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)

这是我在WSDL中的定义:

<wsdl:operation name="MyRequest">
            <wsdl:input message="tns:MyRequest" name="MyRequest">
            </wsdl:input>
            <wsdl:output message="tns:MyRequestResponse" name="MyRequestResponse">
            </wsdl:output>
</wsdl:operation>

<xs:element name="MyRequestResponse" type="xs:string"/>
Run Code Online (Sandbox Code Playgroud)

服务:

 @WebMethod(operationName = "MyRequest")
 @WebResult(name = "MyRequestResponse", targetNamespace = "http://foo/bar", partName = "parameters")
 @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
 public String MyRequest(
            @WebParam(name = "MyRequest", targetNamespace = "http://foo/bar", partName = "parameters")
            MyRequest parameters);
Run Code Online (Sandbox Code Playgroud)

我确实试过使用拦截器并用节点包装响应'OK'.但是,想知道是否有更简洁的方法通过在JAXB/WSDL层中处理它来实现它.

Fed*_*sev 3

根据规范,这不是有效的SOAP 1.1 Body元素。因此,事实上,它不是 SOAP 响应。

因为它不是有效的 SOAP 响应,并且您不发送任何复杂的参数,所以尝试使用 SOAP 框架调用此类服务​​实际上没有什么价值。

将其视为具有专有格式的普通 HTTP 服务会更有意义。发送 HTTP POST 请求并从响应中提取正文中的“OK”部分。如果名称空间前缀预计不会更改,即使不解析 XML,您也可以进行更改。

尽管看起来像“黑客”,但与使用不明显的拦截器和晦涩的设置来破解框架并迫使其执行规范之外的操作相比,它是一种更加干净和可维护的方法。任何追随您检查代码的人都必须花时间理解处理这个独眼 SOAP 背后的所有齿轮。

然而,如果有时存在符合规范的有效复杂 SOAP 主体,有时存在无效的任意内容(如 OK),则重新实现 SOAP 解析是不合理的,而拦截器是正确的方法,可以使无效消息符合规范。在混合情况下,我认为没有简单干净的方法来使用 SOAP/WSDL 规范进行映射,除非消息由拦截器进行预处理和修复。