diff --git a/spring-ws-core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java b/spring-ws-core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
index be432745c..1fe89dacd 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
@@ -433,9 +433,9 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
"No marshaller registered. Check configuration of WebServiceTemplate.");
}
MarshallingUtils.marshal(marshaller, requestPayload, request);
- if (requestCallback != null) {
- requestCallback.doWithMessage(request);
- }
+ }
+ if (requestCallback != null) {
+ requestCallback.doWithMessage(request);
}
}
}, new WebServiceMessageExtractor<>() {
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java
index 24e4c9d49..10a133867 100644
--- a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java
+++ b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java
@@ -29,18 +29,21 @@ import org.assertj.core.api.AssertProvider;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-
+import org.mockito.ArgumentCaptor;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.ws.MockWebServiceMessage;
import org.springframework.ws.MockWebServiceMessageFactory;
import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.WebServiceMessageFactory;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.WebServiceTransportException;
import org.springframework.ws.client.support.destination.DestinationProvider;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.DefaultMessageContext;
import org.springframework.ws.context.MessageContext;
+import org.springframework.ws.soap.SoapMessage;
+import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory;
import org.springframework.ws.transport.FaultAwareWebServiceConnection;
import org.springframework.ws.transport.WebServiceConnection;
import org.springframework.ws.transport.WebServiceMessageSender;
@@ -50,12 +53,14 @@ import org.springframework.xml.transform.StringSource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.isA;
import static org.mockito.Mockito.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@SuppressWarnings("unchecked")
@@ -292,6 +297,35 @@ class WebServiceTemplateTests {
assertThat(result).isEqualTo(unmarshalled);
}
+ @Test
+ void testSendAndReceiveMarshalNullRequestWithSoapAction() throws Exception {
+
+ WebServiceMessageFactory messageFactory = new AxiomSoapMessageFactory();
+ this.template.setMessageFactory(messageFactory);
+
+ Marshaller marshallerMock = mock(Marshaller.class);
+ this.template.setMarshaller(marshallerMock);
+ marshallerMock.marshal(isA(Object.class), isA(Result.class));
+
+ Unmarshaller unmarshallerMock = mock(Unmarshaller.class);
+ this.template.setUnmarshaller(unmarshallerMock);
+ Object unmarshalled = new Object();
+ when(unmarshallerMock.unmarshal(isA(Source.class))).thenReturn(unmarshalled);
+
+ when(this.connectionMock.hasError()).thenReturn(false);
+ when(this.connectionMock.receive(messageFactory)).thenReturn(new MockWebServiceMessage(""));
+ when(this.connectionMock.hasFault()).thenReturn(false);
+ this.connectionMock.close();
+
+ Object result = this.template.marshalSendAndReceive(null,
+ message -> ((SoapMessage)message).setSoapAction("action"));
+
+ assertThat(result).isEqualTo(unmarshalled);
+ ArgumentCaptor msg = ArgumentCaptor.forClass(SoapMessage.class);
+ verify(this.connectionMock).send(msg.capture());
+ assertEquals("\"action\"", msg.getValue().getSoapAction());
+ }
+
@Test
void testSendAndReceiveMarshalNoResponse() throws Exception {