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 {