【问题标题】:How to map an exception thrown by a spring boot web service to a complex fault info?如何将 Spring Boot Web 服务引发的异常映射到复杂的故障信息?
【发布时间】:2019-06-28 09:32:41
【问题描述】:

我使用 Spring Boot 为现有的 WSDL 实现了一个服务提供者。 WSDL 指定带有附加故障消息的服务。相应的故障信息有一些详细信息,包括时间戳、导致异常的类及其堆栈跟踪以及原始请求中包含的信息。所有的细节都单独定义为 XML 元素。

当服务在服务器上执行时,这些信息在运行时可用。如果发生错误,则会引发包含这些信息的适当异常。

使用spring boot可以配置org.springframework.ws.server.EndpointExceptionResolver的实例 将异常映射到故障信息。但是,似乎在其所有实现类中只能添加故障信息消息和故障代码。我没有找到添加结构化对象或更好的方法:定义了 JAXB 序列化的对象。

这怎么可能?

【问题讨论】:

    标签: java spring spring-boot soap fault


    【解决方案1】:

    当然这不是问题。

    一种方法是创建一个自定义 SoapFaultMappingExceptionResolver,将异常映射到故障:

    public class DetailSoapFaultDefinitionExceptionResolver extends SoapFaultMappingExceptionResolver {
    
        private static final QName CODE = new QName("code");
        private static final QName DESCRIPTION = new QName("description");
    
        @Override
        protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
            logger.warn("Exception processed ", ex);
            if (ex instanceof ServiceFaultException) {
                ServiceFault serviceFault = ((ServiceFaultException) ex).getServiceFault();
                SoapFaultDetail detail = fault.addFaultDetail();
                detail.addFaultDetailElement(CODE).addText(serviceFault.getCode());
                detail.addFaultDetailElement(DESCRIPTION).addText(serviceFault.getDescription());
            }
        }
    
    }
    

    请在此处找到完整示例:

    https://memorynotfound.com/spring-ws-add-detail-soapfault-exception-handling/

    【讨论】:

    • 感谢您的初步提示,我得以改进:JAXBContext.newInstance(faultInfo.getClass()).createMarshaller().marshal(faultInfo, fault.addFaultDetail().getResult()); 其中faultInfo 是包含详细信息且存在 JAXB 映射的元素。
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2015-12-27
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多