SOAP call not rejected when interceptor fails

When a ClientInterceptor returns false for handleRequest, the actual
SOAP call should not proceed.

Issue: SWS-892
This commit is contained in:
Arjen Poutsma
2015-03-16 11:11:40 +01:00
parent 3f15500598
commit b6500fe5ac
2 changed files with 9 additions and 13 deletions

View File

@@ -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
*/

View File

@@ -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("<response/>"));
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);
}