From c9d0ebd730953ef693edf275b57cfeeb9bf15af9 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 30 May 2014 17:01:28 -0400 Subject: [PATCH] Rename ResponseBodyInterceptor to ResponseBodyAdvice Issue: SPR-10859 --- .../AnnotationDrivenBeanDefinitionParser.java | 12 +++---- .../WebMvcConfigurationSupport.java | 17 +++++---- ...a => AbstractJsonpResponseBodyAdvice.java} | 6 ++-- ...ractMappingJacksonResponseBodyAdvice.java} | 8 ++--- ...stractMessageConverterMethodProcessor.java | 9 +++-- .../ExceptionHandlerExceptionResolver.java | 36 +++++++++---------- .../annotation/HttpEntityMethodProcessor.java | 4 +-- ...r.java => JsonViewResponseBodyAdvice.java} | 4 +-- .../RequestMappingHandlerAdapter.java | 36 +++++++++---------- .../RequestResponseBodyMethodProcessor.java | 4 +-- ...terceptor.java => ResponseBodyAdvice.java} | 9 +++-- ...hain.java => ResponseBodyAdviceChain.java} | 36 +++++++++---------- ...tationDrivenBeanDefinitionParserTests.java | 16 ++++----- .../WebMvcConfigurationSupportTests.java | 10 +++--- .../RequestMappingHandlerAdapterTests.java | 7 ++-- ...questResponseBodyMethodProcessorTests.java | 4 +-- ...java => ResponseBodyAdviceChainTests.java} | 26 +++++++------- 17 files changed, 123 insertions(+), 121 deletions(-) rename spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/{AbstractJsonpResponseBodyInterceptor.java => AbstractJsonpResponseBodyAdvice.java} (91%) rename spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/{AbstractMappingJacksonResponseBodyInterceptor.java => AbstractMappingJacksonResponseBodyAdvice.java} (91%) rename spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/{JsonViewResponseBodyInterceptor.java => JsonViewResponseBodyAdvice.java} (92%) rename spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/{ResponseBodyInterceptor.java => ResponseBodyAdvice.java} (86%) rename spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/{ResponseBodyInterceptorChain.java => ResponseBodyAdviceChain.java} (61%) rename spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/{ResponseBodyInterceptorChainTests.java => ResponseBodyAdviceChainTests.java} (82%) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 381afeefedd8..ae22662d6268 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Properties; -import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice; import org.springframework.http.converter.json.GsonHttpMessageConverter; import org.w3c.dom.Element; @@ -201,7 +201,7 @@ else if (element.hasAttribute("enableMatrixVariables")) { handlerAdapterDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); handlerAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef); handlerAdapterDef.getPropertyValues().add("messageConverters", messageConverters); - addResponseBodyInterceptors(handlerAdapterDef); + addResponseBodyAdvice(handlerAdapterDef); if (element.hasAttribute("ignore-default-model-on-redirect")) { Boolean ignoreDefaultModel = Boolean.valueOf(element.getAttribute("ignore-default-model-on-redirect")); @@ -253,7 +253,7 @@ else if (element.hasAttribute("ignoreDefaultModelOnRedirect")) { exceptionHandlerExceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); exceptionHandlerExceptionResolver.getPropertyValues().add("messageConverters", messageConverters); exceptionHandlerExceptionResolver.getPropertyValues().add("order", 0); - addResponseBodyInterceptors(exceptionHandlerExceptionResolver); + addResponseBodyAdvice(exceptionHandlerExceptionResolver); String methodExceptionResolverName = parserContext.getReaderContext().registerWithGeneratedName(exceptionHandlerExceptionResolver); @@ -288,10 +288,10 @@ else if (element.hasAttribute("ignoreDefaultModelOnRedirect")) { return null; } - protected void addResponseBodyInterceptors(RootBeanDefinition beanDef) { + protected void addResponseBodyAdvice(RootBeanDefinition beanDef) { if (jackson2Present) { - beanDef.getPropertyValues().add("responseBodyInterceptors", - new RootBeanDefinition(JsonViewResponseBodyInterceptor.class)); + beanDef.getPropertyValues().add("responseBodyAdvice", + new RootBeanDefinition(JsonViewResponseBodyAdvice.class)); } } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index f5b4b1d935da..896abadeffd9 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -17,7 +17,6 @@ package org.springframework.web.servlet.config.annotation; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -76,10 +75,10 @@ import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; -import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; import org.springframework.web.servlet.resource.ResourceUrlProvider; import org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor; @@ -425,9 +424,9 @@ public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { adapter.setCustomReturnValueHandlers(returnValueHandlers); if (jackson2Present) { - List> interceptors = new ArrayList>(); - interceptors.add(new JsonViewResponseBodyInterceptor()); - adapter.setResponseBodyInterceptors(interceptors); + List> interceptors = new ArrayList>(); + interceptors.add(new JsonViewResponseBodyAdvice()); + adapter.setResponseBodyAdvice(interceptors); } AsyncSupportConfigurer configurer = new AsyncSupportConfigurer(); @@ -712,9 +711,9 @@ protected final void addDefaultHandlerExceptionResolvers(List> interceptors = new ArrayList>(); - interceptors.add(new JsonViewResponseBodyInterceptor()); - exceptionHandlerExceptionResolver.setResponseBodyInterceptors(interceptors); + List> interceptors = new ArrayList>(); + interceptors.add(new JsonViewResponseBodyAdvice()); + exceptionHandlerExceptionResolver.setResponseBodyAdvice(interceptors); } exceptionHandlerExceptionResolver.afterPropertiesSet(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.java similarity index 91% rename from spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyInterceptor.java rename to spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.java index 128c4172037f..c595cf937c40 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.java @@ -29,7 +29,7 @@ import java.util.Collection; /** - * A convenient base class for a {@code ResponseBodyInterceptor} to instruct the + * A convenient base class for a {@code ResponseBodyAdvice} to instruct the * {@link org.springframework.http.converter.json.MappingJackson2HttpMessageConverter * MappingJackson2HttpMessageConverter} to serialize with JSONP formatting. * @@ -43,12 +43,12 @@ * @author Rossen Stoyanchev * @since 4.1 */ -public abstract class AbstractJsonpResponseBodyInterceptor extends AbstractMappingJacksonResponseBodyInterceptor { +public abstract class AbstractJsonpResponseBodyAdvice extends AbstractMappingJacksonResponseBodyAdvice { private final String[] jsonpQueryParamNames; - protected AbstractJsonpResponseBodyInterceptor(Collection queryParamNames) { + protected AbstractJsonpResponseBodyAdvice(Collection queryParamNames) { Assert.isTrue(!CollectionUtils.isEmpty(queryParamNames), "At least one query param name is required"); this.jsonpQueryParamNames = queryParamNames.toArray(new String[queryParamNames.size()]); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java similarity index 91% rename from spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyInterceptor.java rename to spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java index dd7a26e0aa3e..903a8dbcce57 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMappingJacksonResponseBodyAdvice.java @@ -25,7 +25,7 @@ import org.springframework.http.server.ServerHttpResponse; /** - * A convenient base class for {@code ResponseBodyInterceptor} implementations + * A convenient base class for {@code ResponseBodyAdvice} implementations * that customize the response before JSON serialization with * {@link org.springframework.http.converter.json.MappingJackson2HttpMessageConverter * MappingJackson2HttpMessageConverter}. @@ -33,11 +33,11 @@ * @author Rossen Stoyanchev * @since 4.1 */ -public abstract class AbstractMappingJacksonResponseBodyInterceptor - implements ResponseBodyInterceptor { +public abstract class AbstractMappingJacksonResponseBodyAdvice + implements ResponseBodyAdvice { - protected AbstractMappingJacksonResponseBodyInterceptor() { + protected AbstractMappingJacksonResponseBodyAdvice() { } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index 09da456b9c8a..ad0e6daf1652 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -31,7 +31,6 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; -import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.accept.ContentNegotiationManager; @@ -55,7 +54,7 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe private final ContentNegotiationManager contentNegotiationManager; - private final ResponseBodyInterceptorChain interceptorChain; + private final ResponseBodyAdviceChain adviceChain; protected AbstractMessageConverterMethodProcessor(List> messageConverters) { @@ -68,11 +67,11 @@ protected AbstractMessageConverterMethodProcessor(List> } protected AbstractMessageConverterMethodProcessor(List> messageConverters, - ContentNegotiationManager manager, List responseBodyInterceptors) { + ContentNegotiationManager manager, List responseBodyAdvice) { super(messageConverters); this.contentNegotiationManager = (manager != null ? manager : new ContentNegotiationManager()); - this.interceptorChain = new ResponseBodyInterceptorChain(responseBodyInterceptors); + this.adviceChain = new ResponseBodyAdviceChain(responseBodyAdvice); } @@ -149,7 +148,7 @@ else if (mediaType.equals(MediaType.ALL) || mediaType.equals(MEDIA_TYPE_APPLICAT selectedMediaType = selectedMediaType.removeQualityValue(); for (HttpMessageConverter messageConverter : this.messageConverters) { if (messageConverter.canWrite(returnValueClass, selectedMediaType)) { - returnValue = this.interceptorChain.invoke(returnValue, returnType, selectedMediaType, + returnValue = this.adviceChain.invoke(returnValue, returnType, selectedMediaType, (Class>) messageConverter.getClass(), inputMessage, outputMessage); ((HttpMessageConverter) messageConverter).write(returnValue, selectedMediaType, outputMessage); if (logger.isDebugEnabled()) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index d2204d64f675..16411f0e06b8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -79,7 +79,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce private ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager(); - private final List responseBodyInterceptors = new ArrayList(); + private final List responseBodyAdvice = new ArrayList(); private final Map, ExceptionHandlerMethodResolver> exceptionHandlerCache = @@ -110,15 +110,15 @@ public ExceptionHandlerExceptionResolver() { } /** - * Add one or more interceptors to be invoked after the execution of a controller + * Add one or more components to be invoked after the execution of a controller * method annotated with {@code @ResponseBody} or returning {@code ResponseEntity} * but before the body is written to the response with the selected * {@code HttpMessageConverter}. */ - public void setResponseBodyInterceptors(List> responseBodyInterceptors) { - this.responseBodyInterceptors.clear(); - if (responseBodyInterceptors != null) { - this.responseBodyInterceptors.addAll(responseBodyInterceptors); + public void setResponseBodyAdvice(List> responseBodyAdvice) { + this.responseBodyAdvice.clear(); + if (responseBodyAdvice != null) { + this.responseBodyAdvice.addAll(responseBodyAdvice); } } @@ -250,7 +250,7 @@ public ApplicationContext getApplicationContext() { @Override public void afterPropertiesSet() { - // Do this first, it may add ResponseBody interceptors + // Do this first, it may add ResponseBodyAdvice beans initExceptionHandlerAdviceCache(); if (this.argumentResolvers == null) { @@ -271,18 +271,18 @@ private void initExceptionHandlerAdviceCache() { logger.debug("Looking for exception mappings: " + getApplicationContext()); } - List beans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()); - Collections.sort(beans, new OrderComparator()); + List adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()); + Collections.sort(adviceBeans, new OrderComparator()); - for (ControllerAdviceBean bean : beans) { - ExceptionHandlerMethodResolver resolver = new ExceptionHandlerMethodResolver(bean.getBeanType()); + for (ControllerAdviceBean adviceBean : adviceBeans) { + ExceptionHandlerMethodResolver resolver = new ExceptionHandlerMethodResolver(adviceBean.getBeanType()); if (resolver.hasExceptionMappings()) { - this.exceptionHandlerAdviceCache.put(bean, resolver); - logger.info("Detected @ExceptionHandler methods in " + bean); + this.exceptionHandlerAdviceCache.put(adviceBean, resolver); + logger.info("Detected @ExceptionHandler methods in " + adviceBean); } - if (ResponseBodyInterceptor.class.isAssignableFrom(bean.getBeanType())) { - this.responseBodyInterceptors.add(bean); - logger.info("Detected ResponseBodyInterceptor implementation in " + bean); + if (ResponseBodyAdvice.class.isAssignableFrom(adviceBean.getBeanType())) { + this.responseBodyAdvice.add(adviceBean); + logger.info("Detected ResponseBodyAdvice implementation in " + adviceBean); } } } @@ -318,12 +318,12 @@ protected List getDefaultReturnValueHandlers() handlers.add(new ModelMethodProcessor()); handlers.add(new ViewMethodReturnValueHandler()); handlers.add(new HttpEntityMethodProcessor( - getMessageConverters(), this.contentNegotiationManager, this.responseBodyInterceptors)); + getMessageConverters(), this.contentNegotiationManager, this.responseBodyAdvice)); // Annotation-based return value types handlers.add(new ModelAttributeMethodProcessor(false)); handlers.add(new RequestResponseBodyMethodProcessor( - getMessageConverters(), this.contentNegotiationManager, this.responseBodyInterceptors)); + getMessageConverters(), this.contentNegotiationManager, this.responseBodyAdvice)); // Multi-purpose return value types handlers.add(new ViewNameMethodReturnValueHandler()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java index 5177f48935d8..25046f6c862a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java @@ -61,8 +61,8 @@ public HttpEntityMethodProcessor(List> messageConverters } public HttpEntityMethodProcessor(List> messageConverters, - ContentNegotiationManager contentNegotiationManager, List responseBodyInterceptors) { - super(messageConverters, contentNegotiationManager, responseBodyInterceptors); + ContentNegotiationManager contentNegotiationManager, List responseBodyAdvice) { + super(messageConverters, contentNegotiationManager, responseBodyAdvice); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyAdvice.java similarity index 92% rename from spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyInterceptor.java rename to spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyAdvice.java index 76a36f0bfe11..81cd82af1802 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/JsonViewResponseBodyAdvice.java @@ -26,7 +26,7 @@ import org.springframework.util.Assert; /** - * A {@code ResponseBodyInterceptor} implementation that adds support for + * A {@code ResponseBodyAdvice} implementation that adds support for * Jackson's {@code @JsonView} annotation declared on a Spring MVC * {@code @RequestMapping} or {@code @ExceptionHandler} method. The serialization * view specified in the annotation will be passed in to the @@ -38,7 +38,7 @@ * * @see com.fasterxml.jackson.databind.ObjectMapper#writerWithView(Class) */ -public class JsonViewResponseBodyInterceptor extends AbstractMappingJacksonResponseBodyInterceptor { +public class JsonViewResponseBodyAdvice extends AbstractMappingJacksonResponseBodyAdvice { @Override 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 7a18d86fc238..235da058ad3b 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 @@ -132,7 +132,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter private List> messageConverters; - private List responseBodyInterceptors = new ArrayList(); + private List responseBodyAdvice = new ArrayList(); private WebBindingInitializer webBindingInitializer; @@ -334,15 +334,15 @@ public List> getMessageConverters() { } /** - * Add one or more interceptors to be invoked after the execution of a controller - * method annotated with {@code @ResponseBody} or returning {@code ResponseEntity} - * but before the body is written to the response with the selected - * {@code HttpMessageConverter}. + * Add one or more components to modify the response after the execution of a + * controller method annotated with {@code @ResponseBody}, or a method returning + * {@code ResponseEntity} and before the body is written to the response with + * the selected {@code HttpMessageConverter}. */ - public void setResponseBodyInterceptors(List> responseBodyInterceptors) { - this.responseBodyInterceptors.clear(); - if (responseBodyInterceptors != null) { - this.responseBodyInterceptors.addAll(responseBodyInterceptors); + public void setResponseBodyAdvice(List> responseBodyAdvice) { + this.responseBodyAdvice.clear(); + if (responseBodyAdvice != null) { + this.responseBodyAdvice.addAll(responseBodyAdvice); } } @@ -498,7 +498,7 @@ protected ConfigurableBeanFactory getBeanFactory() { @Override public void afterPropertiesSet() { - // Do this first, it may add ResponseBody interceptors + // Do this first, it may add ResponseBody advice beans initControllerAdviceCache(); if (this.argumentResolvers == null) { @@ -526,7 +526,7 @@ private void initControllerAdviceCache() { List beans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()); Collections.sort(beans, new OrderComparator()); - List interceptorBeans = new ArrayList(); + List responseBodyAdviceBeans = new ArrayList(); for (ControllerAdviceBean bean : beans) { Set attrMethods = HandlerMethodSelector.selectMethods(bean.getBeanType(), MODEL_ATTRIBUTE_METHODS); @@ -539,14 +539,14 @@ private void initControllerAdviceCache() { this.initBinderAdviceCache.put(bean, binderMethods); logger.info("Detected @InitBinder methods in " + bean); } - if (ResponseBodyInterceptor.class.isAssignableFrom(bean.getBeanType())) { - interceptorBeans.add(bean); - logger.info("Detected ResponseBodyInterceptor implementation in " + bean); + if (ResponseBodyAdvice.class.isAssignableFrom(bean.getBeanType())) { + responseBodyAdviceBeans.add(bean); + logger.info("Detected ResponseBodyAdvice bean in " + bean); } } - if (!interceptorBeans.isEmpty()) { - this.responseBodyInterceptors.addAll(0, interceptorBeans); + if (!responseBodyAdviceBeans.isEmpty()) { + this.responseBodyAdvice.addAll(0, responseBodyAdviceBeans); } } @@ -638,7 +638,7 @@ private List getDefaultReturnValueHandlers() { handlers.add(new ModelMethodProcessor()); handlers.add(new ViewMethodReturnValueHandler()); handlers.add(new HttpEntityMethodProcessor( - getMessageConverters(), this.contentNegotiationManager, this.responseBodyInterceptors)); + getMessageConverters(), this.contentNegotiationManager, this.responseBodyAdvice)); handlers.add(new HttpHeadersReturnValueHandler()); handlers.add(new CallableMethodReturnValueHandler()); handlers.add(new DeferredResultMethodReturnValueHandler()); @@ -648,7 +648,7 @@ private List getDefaultReturnValueHandlers() { // Annotation-based return value types handlers.add(new ModelAttributeMethodProcessor(false)); handlers.add(new RequestResponseBodyMethodProcessor( - getMessageConverters(), this.contentNegotiationManager, this.responseBodyInterceptors)); + getMessageConverters(), this.contentNegotiationManager, this.responseBodyAdvice)); // Multi-purpose return value types handlers.add(new ViewNameMethodReturnValueHandler()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java index 752e8436a429..c084ef64a5c3 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java @@ -73,8 +73,8 @@ public RequestResponseBodyMethodProcessor(List> messageC } public RequestResponseBodyMethodProcessor(List> messageConverters, - ContentNegotiationManager contentNegotiationManager, List responseBodyInterceptors) { - super(messageConverters, contentNegotiationManager, responseBodyInterceptors); + ContentNegotiationManager contentNegotiationManager, List responseBodyAdvice) { + super(messageConverters, contentNegotiationManager, responseBodyAdvice); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdvice.java similarity index 86% rename from spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptor.java rename to spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdvice.java index 5b5cc6332002..028315938242 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdvice.java @@ -27,13 +27,18 @@ * or an {@code ResponseEntity} controller method but before the body is written * with an {@code HttpMessageConverter}. * + *

Implementations may be may be registered directly with + * {@code RequestMappingHandlerAdapter} and {@code ExceptionHandlerExceptionResolver} + * or more likely annotated with {@code @ControllerAdvice} in which case they + * will be auto-detected by both. + * * @author Rossen Stoyanchev * @since 4.1 */ -public interface ResponseBodyInterceptor { +public interface ResponseBodyAdvice { /** - * Whether this interceptor supports the given controller method return type + * Whether this component supports the given controller method return type * and the selected {@code HttpMessageConverter} type. * * @param returnType the return type diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChain.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChain.java similarity index 61% rename from spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChain.java rename to spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChain.java index 178e81cb42c3..d673c6983d54 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChain.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChain.java @@ -28,20 +28,20 @@ import java.util.List; /** - * Invokes a a list of ResponseBodyInterceptor's. + * Invokes a a list of {@link ResponseBodyAdvice} beans. * * @author Rossen Stoyanchev * @since 4.1 */ -class ResponseBodyInterceptorChain { +class ResponseBodyAdviceChain { - private static Log logger = LogFactory.getLog(ResponseBodyInterceptorChain.class); + private static Log logger = LogFactory.getLog(ResponseBodyAdviceChain.class); - private final List interceptors; + private final List advice; - public ResponseBodyInterceptorChain(List interceptors) { - this.interceptors = interceptors; + public ResponseBodyAdviceChain(List advice) { + this.advice = advice; } @@ -50,31 +50,31 @@ public T invoke(T body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { - if (this.interceptors != null) { + if (this.advice != null) { if (logger.isDebugEnabled()) { - logger.debug("Invoking ResponseBody interceptor chain for body=" + body); + logger.debug("Invoking ResponseBodyAdvice chain for body=" + body); } - for (Object interceptor : this.interceptors) { - if (interceptor instanceof ControllerAdviceBean) { - ControllerAdviceBean adviceBean = (ControllerAdviceBean) interceptor; + for (Object advice : this.advice) { + if (advice instanceof ControllerAdviceBean) { + ControllerAdviceBean adviceBean = (ControllerAdviceBean) advice; if (!adviceBean.isApplicableToBeanType(returnType.getContainingClass())) { continue; } - interceptor = adviceBean.resolveBean(); + advice = adviceBean.resolveBean(); } - if (interceptor instanceof ResponseBodyInterceptor) { - ResponseBodyInterceptor typedInterceptor = (ResponseBodyInterceptor) interceptor; - if (typedInterceptor.supports(returnType, selectedConverterType)) { - body = typedInterceptor.beforeBodyWrite(body, returnType, + if (advice instanceof ResponseBodyAdvice) { + ResponseBodyAdvice typedAdvice = (ResponseBodyAdvice) advice; + if (typedAdvice.supports(returnType, selectedConverterType)) { + body = typedAdvice.beforeBodyWrite(body, returnType, selectedContentType, selectedConverterType, request, response); } } else { - throw new IllegalStateException("Expected a ResponseBodyInterceptor: " + interceptor); + throw new IllegalStateException("Expected ResponseBodyAdvice: " + advice); } } if (logger.isDebugEnabled()) { - logger.debug("After interceptor chain body=" + body); + logger.debug("After ResponseBodyAdvice chain body=" + body); } } return body; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java index 5ee33798fcc9..7865cdf69ecf 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java @@ -38,11 +38,11 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; import org.springframework.web.util.UrlPathHelper; @@ -95,8 +95,8 @@ public void testMessageConverters() { loadBeanDefinitions("mvc-config-message-converters.xml"); verifyMessageConverters(appContext.getBean(RequestMappingHandlerAdapter.class), true); verifyMessageConverters(appContext.getBean(ExceptionHandlerExceptionResolver.class), true); - verifyResponseBodyInterceptors(appContext.getBean(RequestMappingHandlerAdapter.class)); - verifyResponseBodyInterceptors(appContext.getBean(ExceptionHandlerExceptionResolver.class)); + verifyResponseBodyAdvice(appContext.getBean(RequestMappingHandlerAdapter.class)); + verifyResponseBodyAdvice(appContext.getBean(ExceptionHandlerExceptionResolver.class)); } @Test @@ -167,13 +167,13 @@ private void verifyMessageConverters(Object bean, boolean hasDefaultRegistration } @SuppressWarnings("unchecked") - private void verifyResponseBodyInterceptors(Object bean) { + private void verifyResponseBodyAdvice(Object bean) { assertNotNull(bean); - Object value = new DirectFieldAccessor(bean).getPropertyValue("responseBodyInterceptors"); + Object value = new DirectFieldAccessor(bean).getPropertyValue("responseBodyAdvice"); assertNotNull(value); assertTrue(value instanceof List); - List converters = (List) value; - assertTrue(converters.get(0) instanceof JsonViewResponseBodyInterceptor); + List converters = (List) value; + assertTrue(converters.get(0) instanceof JsonViewResponseBodyAdvice); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java index c71c12f8d785..a5180e4b54b1 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java @@ -52,7 +52,7 @@ import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite; import org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; -import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyInterceptor; +import org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice; import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @@ -161,9 +161,9 @@ public void requestMappingHandlerAdapter() throws Exception { assertTrue(validator instanceof LocalValidatorFactoryBean); DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(adapter); - List interceptors = (List) fieldAccessor.getPropertyValue("responseBodyInterceptors"); + List interceptors = (List) fieldAccessor.getPropertyValue("responseBodyAdvice"); assertEquals(1, interceptors.size()); - assertEquals(JsonViewResponseBodyInterceptor.class, interceptors.get(0).getClass()); + assertEquals(JsonViewResponseBodyAdvice.class, interceptors.get(0).getClass()); } @Test @@ -192,9 +192,9 @@ public void handlerExceptionResolver() throws Exception { assertNotNull(eher.getApplicationContext()); DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(eher); - List interceptors = (List) fieldAccessor.getPropertyValue("responseBodyInterceptors"); + List interceptors = (List) fieldAccessor.getPropertyValue("responseBodyAdvice"); assertEquals(1, interceptors.size()); - assertEquals(JsonViewResponseBodyInterceptor.class, interceptors.get(0).getClass()); + assertEquals(JsonViewResponseBodyAdvice.class, interceptors.get(0).getClass()); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterTests.java index d615f40c2f10..97cd2a59a091 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterTests.java @@ -19,7 +19,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -235,7 +234,7 @@ public void modelAttributePackageNameAdvice() throws Exception { // SPR-10859 @Test - public void responseBodyInterceptor() throws Exception { + public void responseBodyAdvice() throws Exception { List> converters = new ArrayList<>(); converters.add(new MappingJackson2HttpMessageConverter()); this.handlerAdapter.setMessageConverters(converters); @@ -339,7 +338,7 @@ public void addAttributes(Model model) { } @ControllerAdvice - private static class ResponseCodeSuppressingAdvice extends AbstractMappingJacksonResponseBodyInterceptor { + private static class ResponseCodeSuppressingAdvice extends AbstractMappingJacksonResponseBodyAdvice { @SuppressWarnings("unchecked") @Override @@ -357,7 +356,7 @@ protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaT } @ControllerAdvice - private static class JsonpAdvice extends AbstractJsonpResponseBodyInterceptor { + private static class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice() { super(Arrays.asList("c")); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java index 939968df640c..08dcd9bb78dc 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessorTests.java @@ -299,7 +299,7 @@ public void jacksonJsonViewWithResponseBody() throws Exception { converters.add(new MappingJackson2HttpMessageConverter()); RequestResponseBodyMethodProcessor processor = new RequestResponseBodyMethodProcessor( - converters, null, Arrays.asList(new JsonViewResponseBodyInterceptor())); + converters, null, Arrays.asList(new JsonViewResponseBodyAdvice())); Object returnValue = new JacksonViewController().handleResponseBody(); processor.handleReturnValue(returnValue, methodReturnType, this.mavContainer, this.webRequest); @@ -320,7 +320,7 @@ public void jacksonJsonViewWithResponseEntity() throws Exception { converters.add(new MappingJackson2HttpMessageConverter()); HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor( - converters, null, Arrays.asList(new JsonViewResponseBodyInterceptor())); + converters, null, Arrays.asList(new JsonViewResponseBodyAdvice())); Object returnValue = new JacksonViewController().handleResponseEntity(); processor.handleReturnValue(returnValue, methodReturnType, this.mavContainer, this.webRequest); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChainTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChainTests.java similarity index 82% rename from spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChainTests.java rename to spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChainTests.java index 40db64802078..e18864dbdde7 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyInterceptorChainTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdviceChainTests.java @@ -42,12 +42,12 @@ /** * Unit tests for - * {@link org.springframework.web.servlet.mvc.method.annotation.ResponseBodyInterceptorChain}. + * {@link ResponseBodyAdviceChain}. * * @author Rossen Stoyanchev * @since 4.1 */ -public class ResponseBodyInterceptorChainTests { +public class ResponseBodyAdviceChainTests { private String body; @@ -73,15 +73,15 @@ public void setup() { } @Test - public void responseBodyInterceptor() { + public void responseBodyAdvice() { @SuppressWarnings("unchecked") - ResponseBodyInterceptor interceptor = Mockito.mock(ResponseBodyInterceptor.class); - ResponseBodyInterceptorChain chain = new ResponseBodyInterceptorChain(Arrays.asList(interceptor)); + ResponseBodyAdvice advice = Mockito.mock(ResponseBodyAdvice.class); + ResponseBodyAdviceChain chain = new ResponseBodyAdviceChain(Arrays.asList(advice)); String expected = "body++"; - when(interceptor.supports(this.returnType, this.converterType)).thenReturn(true); - when(interceptor.beforeBodyWrite(eq(this.body), eq(this.returnType), eq(this.contentType), + when(advice.supports(this.returnType, this.converterType)).thenReturn(true); + when(advice.beforeBodyWrite(eq(this.body), eq(this.returnType), eq(this.contentType), eq(this.converterType), same(this.request), same(this.response))).thenReturn(expected); String actual = chain.invoke(this.body, this.returnType, @@ -93,8 +93,8 @@ public void responseBodyInterceptor() { @Test public void controllerAdvice() { - Object interceptor = new ControllerAdviceBean(new MyControllerAdvice()); - ResponseBodyInterceptorChain chain = new ResponseBodyInterceptorChain(Arrays.asList(interceptor)); + Object adviceBean = new ControllerAdviceBean(new MyControllerAdvice()); + ResponseBodyAdviceChain chain = new ResponseBodyAdviceChain(Arrays.asList(adviceBean)); String actual = chain.invoke(this.body, this.returnType, this.contentType, this.converterType, this.request, this.response); @@ -105,8 +105,8 @@ public void controllerAdvice() { @Test public void controllerAdviceNotApplicable() { - Object interceptor = new ControllerAdviceBean(new TargetedControllerAdvice()); - ResponseBodyInterceptorChain chain = new ResponseBodyInterceptorChain(Arrays.asList(interceptor)); + Object adviceBean = new ControllerAdviceBean(new TargetedControllerAdvice()); + ResponseBodyAdviceChain chain = new ResponseBodyAdviceChain(Arrays.asList(adviceBean)); String actual = chain.invoke(this.body, this.returnType, this.contentType, this.converterType, this.request, this.response); @@ -116,7 +116,7 @@ public void controllerAdviceNotApplicable() { @ControllerAdvice - private static class MyControllerAdvice implements ResponseBodyInterceptor { + private static class MyControllerAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class> converterType) { @@ -134,7 +134,7 @@ public String beforeBodyWrite(String body, MethodParameter returnType, } @ControllerAdvice(annotations = Controller.class) - private static class TargetedControllerAdvice implements ResponseBodyInterceptor { + private static class TargetedControllerAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class> converterType) {