diff --git a/security/pom.xml b/security/pom.xml
index d9f5f0a1..b6ea18db 100644
--- a/security/pom.xml
+++ b/security/pom.xml
@@ -136,6 +136,7 @@
org.acegisecurity
acegi-security
+ true
diff --git a/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java b/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java
index b0b42da6..57bf1de8 100755
--- a/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java
+++ b/security/src/main/java/org/springframework/ws/soap/security/wss4j/Wss4jSecurityInterceptor.java
@@ -23,6 +23,7 @@ import java.util.Vector;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.xml.soap.SOAPException;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
@@ -48,6 +49,7 @@ import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.axiom.AxiomSoapMessage;
import org.springframework.ws.soap.axiom.support.AxiomUtils;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
+import org.springframework.ws.soap.saaj.SaajSoapMessageException;
import org.springframework.ws.soap.security.AbstractWsSecurityInterceptor;
import org.springframework.ws.soap.security.WsSecuritySecurementException;
import org.springframework.ws.soap.security.WsSecurityValidationException;
@@ -590,8 +592,14 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl
/** Converts the given {@link SoapMessage} into a {@link Document}. */
private Document toDocument(SoapMessage soapMessage) {
if (soapMessage instanceof SaajSoapMessage) {
- SaajSoapMessage saajMessage = (SaajSoapMessage) soapMessage;
- return saajMessage.getSaajMessage().getSOAPPart();
+ javax.xml.soap.SOAPMessage saajMessage = ((SaajSoapMessage) soapMessage).getSaajMessage();
+ try {
+ saajMessage.saveChanges();
+ }
+ catch (SOAPException ex) {
+ throw new SaajSoapMessageException("Could not save changes", ex);
+ }
+ return saajMessage.getSOAPPart();
}
else if (soapMessage instanceof AxiomSoapMessage) {
AxiomSoapMessage axiomMessage = (AxiomSoapMessage) soapMessage;
@@ -608,7 +616,16 @@ public class Wss4jSecurityInterceptor extends AbstractWsSecurityInterceptor impl
* for a {@link SaajSoapMessage}.
*/
private void replaceMessage(SoapMessage soapMessage, Document envelope) {
- if (soapMessage instanceof AxiomSoapMessage) {
+ if (soapMessage instanceof SaajSoapMessage) {
+ javax.xml.soap.SOAPMessage saajMessage = ((SaajSoapMessage) soapMessage).getSaajMessage();
+ try {
+ saajMessage.saveChanges();
+ }
+ catch (SOAPException ex) {
+ throw new SaajSoapMessageException("Could not save changes", ex);
+ }
+ }
+ else if (soapMessage instanceof AxiomSoapMessage) {
// construct a new Axiom message with the processed envelope
AxiomSoapMessage axiomMessage = (AxiomSoapMessage) soapMessage;
SOAPEnvelope envelopeFromDOMDocument = AxiomUtils.toEnvelope(envelope);
diff --git a/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java b/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java
index 25ee62ff..bcdd05aa 100755
--- a/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java
+++ b/security/src/test/java/org/springframework/ws/soap/security/wss4j/SaajWss4jMessageInterceptorSignTest.java
@@ -1,5 +1,46 @@
package org.springframework.ws.soap.security.wss4j;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import javax.xml.namespace.QName;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeaders;
+import javax.xml.soap.SOAPMessage;
+
+import org.springframework.ws.context.DefaultMessageContext;
+import org.springframework.ws.context.MessageContext;
+import org.springframework.ws.soap.SoapMessage;
+import org.springframework.ws.soap.saaj.SaajSoapMessage;
+import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
+
public class SaajWss4jMessageInterceptorSignTest extends Wss4jMessageInterceptorSignTestCase {
+ public void testSignAndValidate() throws Exception {
+ MessageFactory messageFactory = MessageFactory.newInstance();
+ interceptor.setSecurementActions("Signature");
+ interceptor.setEnableSignatureConfirmation(false);
+ interceptor.setSecurementPassword("123456");
+ interceptor.setSecurementUsername("rsaKey");
+ SOAPMessage saajMessage = messageFactory.createMessage();
+ saajMessage.getSOAPBody()
+ .addBodyElement(new QName("http://fabrikam123.com/payloads", "StockSymbol", "tru")).addTextNode("QQQ");
+ SoapMessage message = new SaajSoapMessage(saajMessage);
+ MessageContext messageContext = new DefaultMessageContext(message, new SaajSoapMessageFactory(messageFactory));
+
+ interceptor.secureMessage(message, messageContext);
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ message.writeTo(bos);
+
+ MimeHeaders mimeHeaders = new MimeHeaders();
+ mimeHeaders.addHeader("Content-Type", "text/xml");
+ ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+
+ SOAPMessage signed = messageFactory.createMessage(mimeHeaders, bis);
+ message = new SaajSoapMessage(signed);
+ messageContext = new DefaultMessageContext(message, new SaajSoapMessageFactory(messageFactory));
+
+ interceptor.validateMessage(message, messageContext);
+ }
+
}