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

Java SOAP响应主体具有无任何节点的纯文本,java,web-services,soap,jaxb,wsdl,Java,Web Services,Soap,Jaxb,Wsdl,如何处理如下所示的SOAP消息响应 我确实尝试过使用拦截器并用节点包装响应“OK”。但是,我想知道是否有更干净的方法来处理JAXB/WSDL层本身。根据规范,这不是一个有效的元素。因此,事实上,它不是SOAP响应 因为它不是有效的SOAP响应,并且您不发送任何复杂的参数,所以尝试使用SOAP框架调用这样的服务实际上没有什么价值 将其视为具有专有格式的普通HTTP服务更有意义。发送HTTP POST请求并从响应中提取正文中的“OK”部分。如果不希望更改名称空间前缀,那么即使不解析XML,也可以这样

如何处理如下所示的SOAP消息响应

我确实尝试过使用拦截器并用节点包装响应“OK”。但是,我想知道是否有更干净的方法来处理JAXB/WSDL层本身。

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

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

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

尽管看起来像一个“黑客”,但与使用不明显的拦截器和晦涩的设置来攻击框架并迫使它做规范之外的事情相比,这是一种更干净、更易于维护的方法。任何跟踪你的人,检查代码,都必须花时间理解处理这个独眼肥皂背后的所有齿轮

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

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

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

至于XML:

<message>OK</message>
OK

到目前为止,您的XML是无效的。正文和标头中的元素必须具有数据类型。

您是否正在尝试生成或使用OK响应?我正在尝试从Mule ESB使用它。根据您的WSDL,此SOAP响应无效。你应该有这样的东西:foo/bar“>好的,您是否真的使用JAX-WS实现来生成此响应?@Cyril:我无法控制响应。我只是在吃。您能否帮助为给定的SOAP响应构建WSDL?谢谢。您能否显示服务提供商(提供此响应的服务提供商)提供的完整原始WSDL?您是否直接从中生成客户端代码?您是否使用ApacheCXF作为客户机的JAX-WS实现(我不知道Mule ESB,但从文档来看它似乎是CXF)?使用响应时会出现什么错误?HanuAthena已经在评论中解释过,对收到的响应没有控制权。你在这里写的东西在两天前就已经提出了。啊没有看到这一点——这是一个评论,不是答案。无论如何,你不能期望运行一个soap端点,它接受无效的xml作为输入。在消息处理之前,你需要截获并纠正无效的响应(如果可能存在难以解析的复杂消息)-已经完成了-或者,如果响应很简单,那么完全跳过SOAP膨胀软件,使用纯HTTP并自己提取所需的内容。如果我正确理解了这个问题,类似的黑客行为已经完成了,问题不是如何进行黑客行为,而是是否有一种标准的、更干净的方法来使用WSDL实现这一点。答案是否定的(据我所知)。问题:“我确实尝试过使用拦截器并用节点包装响应‘OK’。但是,想知道是否有更干净的方法……”
 @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);
<xs:element name="message" type="xs:string"/>
<message>OK</message>