diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java index 921becda..513bc187 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java @@ -42,6 +42,7 @@ import org.springframework.core.io.Resource; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import org.springframework.ws.soap.saaj.SaajSoapMessageException; import org.springframework.ws.transport.TransportConstants; import org.springframework.xml.namespace.QNameUtils; @@ -153,12 +154,14 @@ public abstract class SaajUtils { */ public static int getSaajVersion(SOAPMessage soapMessage) { Assert.notNull(soapMessage, "'soapMessage' must not be null"); + SOAPEnvelope soapEnvelope; try { - return getSaajVersion(soapMessage.getSOAPPart().getEnvelope()); + soapEnvelope = soapMessage.getSOAPPart().getEnvelope(); } - catch (SOAPException e) { - return SAAJ_11; + catch (SOAPException ex) { + throw new SaajSoapMessageException("Could not access envelope: " + ex.getMessage(), ex); } + return getSaajVersion(soapEnvelope); } /** diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/support/SaajUtilsTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/support/SaajUtilsTest.java index 5c119ea6..10f16cd3 100644 --- a/core/src/test/java/org/springframework/ws/soap/saaj/support/SaajUtilsTest.java +++ b/core/src/test/java/org/springframework/ws/soap/saaj/support/SaajUtilsTest.java @@ -16,10 +16,13 @@ package org.springframework.ws.soap.saaj.support; +import java.io.InputStream; + import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.soap.MessageFactory; +import javax.xml.soap.MimeHeaders; import javax.xml.soap.Name; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; @@ -28,7 +31,9 @@ import org.custommonkey.xmlunit.XMLTestCase; import org.w3c.dom.Document; import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; +import org.springframework.ws.soap.saaj.SaajSoapMessageException; public class SaajUtilsTest extends XMLTestCase { @@ -115,5 +120,25 @@ public class SaajUtilsTest extends XMLTestCase { public void testGetSaajVersion() throws Exception { assertEquals("Invalid SAAJ version", SaajUtils.SAAJ_13, SaajUtils.getSaajVersion()); } + + public void testGetSaajVersionInvalidEnvelope() throws Exception { + Resource resource = new ClassPathResource("invalidNamespaceReferenceSoapMessage.xml", getClass()); + InputStream in = null; + try { + in = resource.getInputStream(); + MimeHeaders headers = new MimeHeaders(); + SOAPMessage soapMessage = messageFactory.createMessage(headers, in); + SaajUtils.getSaajVersion(soapMessage); + fail("Should have thrown SaajSoapMessageException as message envelope is invalid and cannot be accessed."); + } + catch (SaajSoapMessageException e) { + // expected + } + finally { + if (in != null) { + in.close(); + } + } + } } \ No newline at end of file diff --git a/core/src/test/resources/org/springframework/ws/soap/saaj/support/invalidNamespaceReferenceSoapMessage.xml b/core/src/test/resources/org/springframework/ws/soap/saaj/support/invalidNamespaceReferenceSoapMessage.xml new file mode 100644 index 00000000..a165c3f4 --- /dev/null +++ b/core/src/test/resources/org/springframework/ws/soap/saaj/support/invalidNamespaceReferenceSoapMessage.xml @@ -0,0 +1,7 @@ + + + + + +