Web Services < faultcode>SOAP-ENV:服务器< /faultcode>在SOAP和Spring WS中始终是相同的值

70gysomp  于 2022-11-15  发布在  Spring
关注(0)|答案(2)|浏览(207)

我将尝试使用以下代码在Spring WS(java)中捕获SOAP Web服务中的异常:

String faultString = "String Y";
            String faultCodeValue = "Code X";
            QName faultCode = new QName("http://schemas.xmlsoap.org/soap/envelope/", faultCodeValue);
            SOAPFault soapFault = null;
            soapFault = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createFault(faultString, faultCode);
            throw new SOAPFaultException(soapFault);

然而,我总是得到相同的<faultcode>像这个(<faultcode>SOAP-ENV:Server</faultcode>)
(even当我更改faultCodeValue变量中的值时):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring xml:lang="en">String Y</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

是否有人知道如何在Web服务响应中更改此值?

ohfgkhjo

ohfgkhjo1#

实际上,我无法得到它。你抛出FaultException,然后捕捉并创建一些SOAPMessage?没有QName,我得到了预期的结果。

SOAPMessage message = MessageFactory.newInstance().createMessage();
        SOAPFault fault = message.getSOAPBody().addFault();
        fault.setFaultString("Error");
        fault.setFaultCode("99");

        message.getSOAPBody().appendChild(fault);

        message.writeTo(System.out);

响应;

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
    <SOAP-ENV:Fault>
        <faultcode>99</faultcode>
        <faultstring>Error</faultstring>
    </SOAP-ENV:Fault>
</SOAP-ENV:Body>
sg24os4d

sg24os4d2#

您可以通过多种方式实现此目的。如果您需要在SOAP响应中返回动态自定义错误代码,请执行以下操作:
1.声明一个类,它扩展了Spring SoapFaultMappingExceptionResolver类
1.在上面声明的类中,重写protected SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex)方法并提供自定义实现,如下所示:

@Override
protected SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex) {

    String definitionText = "SERVER";
    if (ex instanceof ServiceFaultException) {
        MyServiceFault serviceFault = ((MyServiceFaultException) ex).getServiceFault();
        QName faultCode = new QName("http://schemas.xmlsoap.org/soap/envelope/", serviceFault.getErrorCd());
        definitionText = faultCode.toString();
    }
    SoapFaultDefinitionEditor editor = new SoapFaultDefinitionEditor();
    editor.setAsText(definitionText);
    return (SoapFaultDefinition) editor.getValue();
}

您可以通过覆盖

customizeFault(Object endpoint, Exception ex, SoapFault fault)

这个类别的。

相关问题