diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index bbd23577ed5..0e324b872dd 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -181,13 +181,22 @@ public final class WebAsyncManager { * @param interceptor the interceptor to register */ public void registerCallableInterceptor(Object key, CallableProcessingInterceptor interceptor) { - Assert.notNull(interceptor, "interceptor is required"); + Assert.notNull(key, "Key is required"); + Assert.notNull(interceptor, "CallableProcessingInterceptor is required"); this.callableInterceptors.put(key, interceptor); } - public void registerAllCallableInterceptors(Map interceptors) { - Assert.notNull(interceptors); - this.callableInterceptors.putAll(interceptors); + /** + * Register a {@link CallableProcessingInterceptor} without a key. + * The key is derived from the class name and hashcode. + * @param interceptor the interceptor to register + */ + public void registerCallableInterceptor(CallableProcessingInterceptor... interceptors) { + Assert.notNull(interceptors, "A CallableProcessingInterceptor is required"); + for (CallableProcessingInterceptor interceptor : interceptors) { + String key = interceptor.getClass().getName() + ":" + interceptor.hashCode(); + this.callableInterceptors.put(key, interceptor); + } } /** @@ -196,13 +205,23 @@ public final class WebAsyncManager { * @param interceptor the interceptor to register */ public void registerDeferredResultInterceptor(Object key, DeferredResultProcessingInterceptor interceptor) { - Assert.notNull(interceptor, "interceptor is required"); + Assert.notNull(key, "Key is required"); + Assert.notNull(interceptor, "DeferredResultProcessingInterceptor is required"); this.deferredResultInterceptors.put(key, interceptor); } - public void registerAllDeferredResultInterceptors(Map interceptors) { - Assert.notNull(interceptors); - this.deferredResultInterceptors.putAll(interceptors); + /** + * Register a {@link DeferredResultProcessingInterceptor} without a key. + * The key is derived from the class name and hashcode. + * @param key the key + * @param interceptors the interceptor to register + */ + public void registerDeferredResultInterceptor(DeferredResultProcessingInterceptor... interceptors) { + Assert.notNull(interceptors, "A DeferredResultProcessingInterceptor is required"); + for (DeferredResultProcessingInterceptor interceptor : interceptors) { + String key = interceptors.getClass().getName() + ":" + interceptors.hashCode(); + this.deferredResultInterceptors.put(key, interceptor); + } } /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index cda3705e61d..60223265d53 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -138,11 +138,9 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i private Long asyncRequestTimeout; - private final Map callableInterceptors = - new LinkedHashMap(); + private CallableProcessingInterceptor[] callableInterceptors = new CallableProcessingInterceptor[] {}; - private final Map deferredResultInterceptors = - new LinkedHashMap(); + private DeferredResultProcessingInterceptor[] deferredResultInterceptors = new DeferredResultProcessingInterceptor[] {}; private boolean ignoreDefaultModelOnRedirect = false; @@ -378,10 +376,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i */ public void setCallableInterceptors(List interceptors) { Assert.notNull(interceptors); - for (int index = 0 ; index < interceptors.size(); index++) { - CallableProcessingInterceptor interceptor = interceptors.get(index); - this.callableInterceptors.put(getInterceptorKey(interceptor, index), interceptor); - } + this.callableInterceptors = interceptors.toArray(new CallableProcessingInterceptor[interceptors.size()]); } /** @@ -390,14 +385,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i */ public void setDeferredResultInterceptors(List interceptors) { Assert.notNull(interceptors); - for (int index = 0 ; index < interceptors.size(); index++) { - DeferredResultProcessingInterceptor interceptor = interceptors.get(index); - this.deferredResultInterceptors.put(getInterceptorKey(interceptor, index), interceptor); - } - } - - private String getInterceptorKey(Object interceptor, int index) { - return this.hashCode() + ":" + interceptor.getClass().getName() + "#" + index; + this.deferredResultInterceptors = interceptors.toArray(new DeferredResultProcessingInterceptor[interceptors.size()]); } /** @@ -740,8 +728,8 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i final WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); asyncManager.setTaskExecutor(this.taskExecutor); asyncManager.setAsyncWebRequest(asyncWebRequest); - asyncManager.registerAllCallableInterceptors(this.callableInterceptors); - asyncManager.registerAllDeferredResultInterceptors(this.deferredResultInterceptors); + asyncManager.registerCallableInterceptor(this.callableInterceptors); + asyncManager.registerDeferredResultInterceptor(this.deferredResultInterceptors); if (asyncManager.hasConcurrentResult()) { Object result = asyncManager.getConcurrentResult(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java index 410994fad42..737e46de0b1 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java @@ -484,13 +484,13 @@ public class MvcNamespaceTests { assertEquals(ConcurrentTaskExecutor.class, fieldAccessor.getPropertyValue("taskExecutor").getClass()); assertEquals(2500L, fieldAccessor.getPropertyValue("asyncRequestTimeout")); - Map callableInterceptors = - (Map) fieldAccessor.getPropertyValue("callableInterceptors"); - assertEquals(1, callableInterceptors.size()); + CallableProcessingInterceptor[] callableInterceptors = + (CallableProcessingInterceptor[]) fieldAccessor.getPropertyValue("callableInterceptors"); + assertEquals(1, callableInterceptors.length); - Map deferredResultInterceptors = - (Map) fieldAccessor.getPropertyValue("deferredResultInterceptors"); - assertEquals(1, deferredResultInterceptors.size()); + DeferredResultProcessingInterceptor[] deferredResultInterceptors = + (DeferredResultProcessingInterceptor[]) fieldAccessor.getPropertyValue("deferredResultInterceptors"); + assertEquals(1, deferredResultInterceptors.length); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java index 7547f262463..8035b90ed91 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java @@ -149,13 +149,13 @@ public class WebMvcConfigurationSupportExtensionTests { assertEquals(ConcurrentTaskExecutor.class, fieldAccessor.getPropertyValue("taskExecutor").getClass()); assertEquals(2500L, fieldAccessor.getPropertyValue("asyncRequestTimeout")); - Map callableInterceptors = - (Map) fieldAccessor.getPropertyValue("callableInterceptors"); - assertEquals(1, callableInterceptors.size()); + CallableProcessingInterceptor[] callableInterceptors = + (CallableProcessingInterceptor[]) fieldAccessor.getPropertyValue("callableInterceptors"); + assertEquals(1, callableInterceptors.length); - Map deferredResultInterceptors = - (Map) fieldAccessor.getPropertyValue("deferredResultInterceptors"); - assertEquals(1, deferredResultInterceptors.size()); + DeferredResultProcessingInterceptor[] deferredResultInterceptors = + (DeferredResultProcessingInterceptor[]) fieldAccessor.getPropertyValue("deferredResultInterceptors"); + assertEquals(1, deferredResultInterceptors.length); assertEquals(false, fieldAccessor.getPropertyValue("ignoreDefaultModelOnRedirect")); }