diff --git a/core/src/main/java/org/springframework/ws/soap/server/endpoint/AbstractSoapFaultDefinitionExceptionResolver.java b/core/src/main/java/org/springframework/ws/soap/server/endpoint/AbstractSoapFaultDefinitionExceptionResolver.java index 7c2705c7..4bedc201 100644 --- a/core/src/main/java/org/springframework/ws/soap/server/endpoint/AbstractSoapFaultDefinitionExceptionResolver.java +++ b/core/src/main/java/org/springframework/ws/soap/server/endpoint/AbstractSoapFaultDefinitionExceptionResolver.java @@ -65,27 +65,27 @@ public abstract class AbstractSoapFaultDefinitionExceptionResolver extends Abstr if (definition == null) { return false; } - if (!StringUtils.hasLength(definition.getFaultStringOrReason())) { - String faultString = StringUtils.hasLength(ex.getMessage()) ? ex.getMessage() : ex.toString(); - definition.setFaultStringOrReason(faultString); + + String faultStringOrReason = definition.getFaultStringOrReason(); + if (!StringUtils.hasLength(faultStringOrReason)) { + faultStringOrReason = StringUtils.hasLength(ex.getMessage()) ? ex.getMessage() : ex.toString(); } SoapBody soapBody = ((SoapMessage) messageContext.getResponse()).getSoapBody(); SoapFault fault = null; if (SoapFaultDefinition.SERVER.equals(definition.getFaultCode()) || SoapFaultDefinition.RECEIVER.equals(definition.getFaultCode())) { - fault = soapBody.addServerOrReceiverFault(definition.getFaultStringOrReason(), definition.getLocale()); + fault = soapBody.addServerOrReceiverFault(faultStringOrReason, definition.getLocale()); } else if (SoapFaultDefinition.CLIENT.equals(definition.getFaultCode()) || SoapFaultDefinition.SENDER.equals(definition.getFaultCode())) { - fault = soapBody.addClientOrSenderFault(definition.getFaultStringOrReason(), definition.getLocale()); + fault = soapBody.addClientOrSenderFault(faultStringOrReason, definition.getLocale()); } else { // custom code, only supported for SOAP 1.1 if (soapBody instanceof Soap11Body) { Soap11Body soap11Body = (Soap11Body) soapBody; - fault = soap11Body.addFault(definition.getFaultCode(), definition.getFaultStringOrReason(), - definition.getLocale()); + fault = soap11Body.addFault(definition.getFaultCode(), faultStringOrReason, definition.getLocale()); } else { logger.warn("SOAP 1.2 does not allow custom FaultCodes, only SENDER or RECEIVER."); diff --git a/core/src/test/java/org/springframework/ws/soap/server/endpoint/SoapFaultMappingExceptionResolverTest.java b/core/src/test/java/org/springframework/ws/soap/server/endpoint/SoapFaultMappingExceptionResolverTest.java index 92ab39b1..68f63c9d 100644 --- a/core/src/test/java/org/springframework/ws/soap/server/endpoint/SoapFaultMappingExceptionResolverTest.java +++ b/core/src/test/java/org/springframework/ws/soap/server/endpoint/SoapFaultMappingExceptionResolverTest.java @@ -149,7 +149,6 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { resolver.setExceptionMappings(mappings); SoapFaultDefinition defaultFault = new SoapFaultDefinition(); defaultFault.setFaultCode(SoapFaultDefinition.CLIENT); - defaultFault.setFaultStringOrReason("faultstring"); resolver.setDefaultFault(defaultFault); MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); @@ -164,7 +163,20 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), fault.getFaultCode()); - assertEquals("Invalid fault string on fault", "faultstring", fault.getFaultStringOrReason()); + assertEquals("Invalid fault string on fault", "bla", fault.getFaultStringOrReason()); + assertNull("Detail on fault", fault.getFaultDetail()); + + // SWS-226 + result = resolver.resolveException(context, null, new IllegalArgumentException()); + assertTrue("resolveException returns false", result); + assertTrue("Context has no response", context.hasResponse()); + response = (SoapMessage) context.getResponse(); + assertTrue("Response has no fault", response.getSoapBody().hasFault()); + fault = (Soap11Fault) response.getSoapBody().getFault(); + assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), + fault.getFaultCode()); + assertEquals("Invalid fault string on fault", "java.lang.IllegalArgumentException", + fault.getFaultStringOrReason()); assertNull("Detail on fault", fault.getFaultDetail()); }