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 5d931492..501214d0 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 @@ -590,16 +590,19 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService requestCallback.doWithMessage(messageContext.getRequest()); } // Apply handleRequest of registered interceptors + boolean intercepted = false; if (interceptors != null) { for (int i = 0; i < interceptors.length; i++) { interceptorIndex = i; if (!interceptors[i].handleRequest(messageContext)) { + intercepted = true; break; } } } - // if an interceptor has set a response, we don't send/receive - if (!messageContext.hasResponse()) { + // no send/receive if an interceptor has set a response or if the chain + // has been interrupted + if (!messageContext.hasResponse() && !intercepted) { sendRequest(connection, messageContext.getRequest()); if (hasError(connection, messageContext.getRequest())) { triggerAfterCompletion(interceptorIndex, messageContext, null); @@ -622,6 +625,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService } } else { + triggerAfterCompletion(interceptorIndex, messageContext, null); return null; } } @@ -793,8 +797,8 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService * invoke afterCompletion for all interceptors whose handleRequest invocation has * successfully completed and returned true, in addition to the last interceptor who * returned {@code false}. - * @param mappedEndpoint the mapped EndpointInvocationChain * @param interceptorIndex index of last interceptor that successfully completed + * @param messageContext the message context * @param ex Exception thrown on handler execution, or {@code null} if none * @see ClientInterceptor#afterCompletion */ diff --git a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTest.java b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTest.java index 7a34ea90..62143065 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTest.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTest.java @@ -407,32 +407,24 @@ public class WebServiceTemplateTest { } @Test - public void testInterceptorsIntercepted() throws Exception { + public void testInterceptorsInterceptedNoResponse() throws Exception { MessageContext messageContext = new DefaultMessageContext(messageFactory); ClientInterceptor interceptorMock1 = createStrictMock("interceptor1", ClientInterceptor.class); ClientInterceptor interceptorMock2 = createStrictMock("interceptor2", ClientInterceptor.class); template.setInterceptors(new ClientInterceptor[]{interceptorMock1, interceptorMock2}); expect(interceptorMock1.handleRequest(isA(MessageContext.class))).andReturn(false); - expect(interceptorMock1.handleResponse(isA(MessageContext.class))).andReturn(true); interceptorMock1.afterCompletion(isA(MessageContext.class), (Exception)isNull()); WebServiceMessageCallback requestCallback = createMock(WebServiceMessageCallback.class); requestCallback.doWithMessage(messageContext.getRequest()); WebServiceMessageExtractor extractorMock = createMock(WebServiceMessageExtractor.class); - Object extracted = new Object(); - expect(extractorMock.extractData(isA(WebServiceMessage.class))).andReturn(extracted); - - connectionMock.send(isA(WebServiceMessage.class)); - expect(connectionMock.hasError()).andReturn(false); - expect(connectionMock.receive(messageFactory)).andReturn(new MockWebServiceMessage("")); - expect(connectionMock.hasFault()).andReturn(false); replay(connectionMock, interceptorMock1, interceptorMock2, requestCallback, extractorMock); Object result = template.doSendAndReceive(messageContext, connectionMock, requestCallback, extractorMock); - assertEquals("Invalid response", extracted, result); + assertNull(result); verify(connectionMock, interceptorMock1, interceptorMock2, requestCallback, extractorMock); }