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

时间:2016-11-28 08:59:47

标签: java web-services soap jaxb wsdl

如何处理下面的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>

这是我在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"/>

服务:

 @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);

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

2 个答案:

答案 0 :(得分:3)

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

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

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

尽管看起来像是一个“黑客”,但它比使用非显而易见的拦截器和一个模糊的设置来破解框架并迫使它做出超出规范的事情,这是一种更干净和可维护的方法。任何跟踪你的人,检查代码,都必须花时间了解处理这种独眼皂的所有方法。

但是,如果有时候有一个符合规范的有效复杂SOAP主体,并且有时存在无效的任意内容,例如OK,重新实现SOAP解析是不合理的,并且拦截器是可行的方式,带来内联的无效消息规范。在混合的情况下,我认为除非消息是由拦截器预处理和修复的,否则没有简单的干净方式来使用SOAP / WSDL规范进行映射。

答案 1 :(得分:0)

如果查看here,您可以看到SOAP信封的基本XSD格式。因此,如果您使用“OK”字符串并将其添加到正文中的字符串元素(字符串标记),那么您应该没问题。

<xs:element name="message" type="xs:string"/>

至于XML:

<message>OK</message>

截至目前,您的XML无效。正文和标题中的元素必须具有数据类型。