【问题标题】:Is it possible to send "False" response from Interceptors in Apache CXF and Spring SOAP WS?是否可以从 Apache CXF 和 Spring SOAP WS 中的拦截器发送“错误”响应?
【发布时间】:2016-12-28 13:36:05
【问题描述】:

我的 SOAP Web 服务之一的消费者无法读取 SOAP 错误(架构验证),因此他希望我们发送“Ok = false”响应而不是架构验证失败消息。

我不确定我们是否可以通过任何方式自定义拦截器来生成错误响应而不是 SOAP 错误。

截至今天,我正在使用拦截器生成故障,如下所示

@org.apache.cxf.interceptor.InInterceptors(interceptors = {"com.xxx.piano.services.interceptors.RequestParserInterceptor",
    "com.xxx.piano.services.interceptors.RequestInterceptor"})
@SchemaValidation(type = SchemaValidation.SchemaValidationType.IN)
@org.apache.cxf.interceptor.OutFaultInterceptors(classes =  RequestParsingValidator.class)

截至今天,我遇到了如下错误

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <soap:Fault>
     <faultcode>soap:Server</faultcode>
     <faultstring>[City is empty !] </faultstring>
  </soap:Fault>
 </soap:Body>
</soap:Envelope>

虽然我想要以下内容:

    <ns3:XXXServiceTypeResponse>
        <OK>false</OK>
        <Error>
            <Message>Duplicate Product Individual Identifier.</Message>
            <TechnicalDescription>Postal Code Missing</TechnicalDescription>
            <ErrorCode>E0022</ErrorCode>
        </Error>
        <ns3:ResponseID>01202662-0010-0001-0001-4617844469</ns3:ResponseID>
    </ns3:XXXServiceTypeResponse>

请帮忙。

【问题讨论】:

    标签: spring soap cxf interceptor spring-ws


    【解决方案1】:

    使用拦截器可以自定义响应,但我不建议返回 WSDL 中不存在的消息,这是客户端和服务器之间的合同。

    相反,它会提出答案有错误代码,而不是生成肥皂错误。通过这种方式,您的客户也将能够为他的编程语言自动生成代码。

    每条消息都有状态(正常)、错误详细信息以及状态正确时的通常响应

    <ns3:XXXServiceTypeResponse>
          <OK>false</OK>
          <Error>
              <Message>Duplicate Product Individual Identifier.</Message>
              <TechnicalDescription>Postal Code Missing</TechnicalDescription>
              <ErrorCode>E0022</ErrorCode>
          </Error>
          <ns3:ResponseID>01202662-0010-0001-0001-4617844469</ns3:ResponseID>
          <ns3:ResponseIfOk />
      </ns3:XXXServiceTypeResponse>
    

    【讨论】:

    • 不确定我是否理解正确@pedrofb。您的意思是我们应该尝试将故障转换为响应对象吗?但就我而言,这里的消费者无法解析故障响应。 :(
    • 当然我的英语不太好。我建议不要使用故障并更改对象模型。不要在业务逻辑中引发错误,而是捕获异常并将错误代码作为返回对象的属性返回。在您的每条响应消息中都包含此属性。这种方案在soap中很常见,以避免使用错误(如果可能,我更喜欢使用错误)
    • 谢谢。但后来我想为失败的验证消息构建一个标准响应。我在其他地方读到过,无法从 CXF 拦截器创建 ServiceResponse 消息。如果你能解释一下这样做的好方法,那就太好了。
    • 使用拦截器,您可以访问交换的消息。请参阅我的回答 stackoverflow.com/a/38587928/6371459 一个拦截器来提取消息的有效负载并根据需要设置新内容。您将需要一个扩展 AbstractPhaseInterceptor(通用)或 AbstractSoapInterceptor 的 OUT 拦截器,获取有效负载,分析数据并编写新的 SOAP 消息。您的客户端还需要直接解析消息,因为消息格式不存在于 WSDL 中,其编程语言不会生成适当的代码,因此会引发异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多