Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring-WS - return valid response on Exception

I have a SOAP endpoint which should return response type A based on request type B. But during the processing of a request, I'm expecting errors (like unable to call downstream service) which throw custom exception for example type ExpEx. And now I want to do custom error mapping, because in case of errors, I don't want to return type A but want to return type CFault (which is defined in wsdl also). Now question:

  • is it possible to create a custom error handle which returns CFault instead of A
  • or is it possible to make enpoint allow to return two types of responses A and CFault (I think Object) ?

my endpoint:

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
}

}

like image 294
lukisp Avatar asked Dec 14 '25 01:12

lukisp


1 Answers

First of all, take a look on that: https://docs.spring.io/spring-ws/sites/2.0/reference/html/server.html#server-endpoint-exception-resolver

I am going to highlight some of that:

According to documentation, you can create your own exception class to indicate the SOAP Fault that should be returned whenever that exception is thrown. Just annotate class with @SoapFault annotation.

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);
    }
}

If this doesn't suit you, you can mess with SoapFaultAnnotationExceptionResolver (https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/soap/server/endpoint/SoapFaultAnnotationExceptionResolver.html). This resolver lets you map exception classes to SOAP Fault:

<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>

You can use this to add 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());
    }
}

I have once used EndpointInterceptor to mess with SOAPHeader. Perhaps you can use it to do the work with SOAPFault (https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/server/EndpointInterceptor.html).

You can extract SOAPFault from MessageContext like this:

@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
}

You can read about SOAPFault interface here https://docs.spring.io/spring-ws/site/apidocs/org/springframework/ws/soap/SoapFault.html

like image 133
Kamil Nowak Avatar answered Dec 16 '25 22:12

Kamil Nowak



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!