如何将 spring 启动 Web 服务抛出的异常映射到复杂的故障信息?
How to map an exception thrown by a spring boot web service to a complex fault info?
我使用 Spring Boot 为现有的 WSDL 实现了一个服务提供者。 WSDL 指定带有附加故障消息的服务。相应的故障信息有一些详细信息,包括时间戳、引发异常的 class 及其堆栈跟踪以及原始请求中包含的信息。所有细节都单独定义为 XML 个元素。
当服务在服务器上执行时,这些信息在运行时可用。如果发生错误,则会抛出包含这些信息的适当异常。
使用 spring 引导可以配置 org.springframework.ws.server.EndpointExceptionResolver
的实例
将异常映射到故障信息。但是,似乎在其所有实现中 classes 只能添加故障信息消息和故障代码。我没有找到添加结构化对象或更好的方法:定义了 JAXB 序列化的对象。
这怎么可能?
这当然不是问题。
一种方法是创建自定义 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/
我使用 Spring Boot 为现有的 WSDL 实现了一个服务提供者。 WSDL 指定带有附加故障消息的服务。相应的故障信息有一些详细信息,包括时间戳、引发异常的 class 及其堆栈跟踪以及原始请求中包含的信息。所有细节都单独定义为 XML 个元素。
当服务在服务器上执行时,这些信息在运行时可用。如果发生错误,则会抛出包含这些信息的适当异常。
使用 spring 引导可以配置 org.springframework.ws.server.EndpointExceptionResolver
的实例
将异常映射到故障信息。但是,似乎在其所有实现中 classes 只能添加故障信息消息和故障代码。我没有找到添加结构化对象或更好的方法:定义了 JAXB 序列化的对象。
这怎么可能?
这当然不是问题。
一种方法是创建自定义 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/