<faultcode>SOAP-ENV:Server</faultcode> 在 SOAP 和 Spring WS 中始终是相同的值

问题描述 投票:0回答:3

我将尝试使用以下代码从 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>)

(即使我更改了

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>

有人知道如何在网络服务响应中更改此值吗?

java spring web-services soap
3个回答
0
投票

实际上我无法得到它。你抛出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>


0
投票

您可以通过多种方式实现这一目标。如果您需要在 SOAP 响应中返回动态自定义错误代码。执行以下操作:

  1. 声明一个扩展 springs SoapFaultMappingExceptionResolver 类的类
  2. 在上面声明的类中,重写

    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)

本班的。


0
投票

实际上我被同样的问题困扰了一个星期,但我想通了。我知道这是一个老问题,但想把我的解决方案留给那些像我一样在 2023 年仍在挣扎的人。

当您抛出 SOAPFault

throw new SOAPFaultException(fault)
时,它将使用 SOAP 的默认 XML 返回错误。由于某种原因,默认 XML 允许您修改错误字符串,但不能修改错误代码,因此为什么在控制台中它说您修改了 SOAPFault,但呈现的 SOAPFaultException 将不会发生任何变化,因为它将尝试坚持使用默认的 SOAP XML,这就是你的情况。

解决方案是创建您的 CustomException 类,并创建一个扩展 AbstractSoapFaultDefinitionExceptionResolver 的类,以便当 Spring WS 观察到抛出的 CustomException 时,它会使用自定义解析器。

所以你需要两个类,CustomException:

  public class CustomException extends Exception {
}

和异常解析器:

public class ExceptionResolver extends AbstractSoapFaultDefinitionExceptionResolver {

    @Override
    protected SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex) {
        if (ex instanceof CustomException) {
            // do something
        }
    }
    @Override
    protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
        if (ex instanceof CustomException) {
            CustomException customException = ((CustomException) ex);
            try {
                     // customize your fault message
                } catch (Exception e) {
                    throw new RuntimeException("Error customizing", e);
                }
            }
        }
    }
}

然后在 webservice.config 中,让 Spring 知道使用这个解析器

    @Bean(name = "soapFaultAnnotationExceptionResolver")
    public ExceptionResolver exceptionResolver() {
        return new ExceptionResolver();
    }

如果尚未启用,您可能必须启用 allowed-bean-definition-overriding 选项。

希望这可以帮助任何陷入困境的人!

© www.soinside.com 2019 - 2024. All rights reserved.