gpt4 book ai didi

Spring-WS - 返回异常的有效响应

转载 作者:行者123 更新时间:2023-12-02 00:35:31 24 4
gpt4 key购买 nike

我有 soap andpoint,它应该根据请求类型 B 返回响应类型 A。但是在处理请求期间,我预计会出现错误(例如无法调用下游服务),这些错误会抛出 expEx 类型的异常。现在我想做自定义错误映射,因为在发生错误的情况下我不想返回类型 A 但想返回类型 CFault(也在 wsd 中定义)。现在问题:- 可以创建自定义的 eero 句柄,它会 rturn CFault 而不是 A- 或者是否可以让 enpoint 允许返回两种类型的响应 A 和 CFault(我认为是对象)?

我的观点:

public class FantasticEndpoint extend WebServiceEndpoint {
private static final String NAMESPACE = "http://www.fantastic.com/SOA/tmp/FantasticService/v_2_4";

@PayloadRoot(namespace = NAMESPACE, localPart = "handleBOperation")
@ResponsePayload
public A createConsumers(@RequestPayload B b{
//do some dangerous logic possility throw EXCEPTION
// if EXCEPTION return CFault or return A if normal processing
}

最佳答案

首先,看一下:https://docs.spring.io/spring-ws/sites/2.0/reference/html/server.html#server-endpoint-exception-resolver

我要强调其中的一些:

根据文档,您可以创建自己的异常类来指示每当抛出该异常时应返回的 SOAP 错误。只需使用 @SoapFault 注释来注释类。

import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;

@SoapFault(faultCode = FaultCode.SERVER)
public class MyCustomException extends Exception {
public MyClientException(String message) {
super(message);
}
}

如果这不适合您,您可以使用 SoapFaultAnnotationExceptionResolver ( https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/soap/server/endpoint/SoapFaultAnnotationExceptionResolver.html )。此解析器允许您将异常类映射到 SOAP 错误:

<beans>
<bean id="exceptionResolver" class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
<property name="defaultFault" value="SERVER"/>
<property name="exceptionMappings">
<value>
org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request
</value>
</property>
</bean>

您可以使用它来添加 SoapFaultDetail:

public class MySoapFaultDefinitionExceptionResolver 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) {
if (ex instanceof MyCustomException) {
SoapFaultDetail detail = fault.addFaultDetail();
detail.addFaultDetailElement(CODE).addText("SOMECODE");
detail.addFaultDetailElement(DESCRIPTION).addText(ex.getMessage());
}
}

我曾经用 EndpointInterceptor 来搞乱 SOAPHeader。也许您可以使用它来完成 SOAPFault ( https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/server/EndpointInterceptor.html) 的工作。

您可以像这样从 MessageContext 中提取 SOAPFault:

@Override
public boolean handleFault(MessageContext messageContext, Object o) throws Exception {
SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
SOAPMessage soapMessage = soapResponse.getSaajMessage();
SOAPBody body = soapMessage.getSOAPBody();
SOAPFault fault = body.getFault();
//do something with fault here
return true
}

您可以在此处阅读有关 SOAPFault 接口(interface)的信息 https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/soap/SoapFault.html

关于Spring-WS - 返回异常的有效响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com