统一响应接口封装
在上一家公司中我经常看到接口中返回的直接是一个对象集。然而在响应后却又封装了{msg:"",state:"",obj:""},这些参数我就很纳闷这个是如何实现的。我第一反应就是使用了AOP。但是找了许久并 未 发现哪里使用了AOP的形式。经过层层的深入我发现了一个接口和一个注解,才慢慢的打开迷层。 ResponseBodyAdvice
ResponseBodyAdvice 这个接口一看就是通过增强器进行织入的,我们从Advice就可以看出。这个需要配合@ControllerAdvice或者@RestControllerAdvice
ResponseBodyAdvice接口是spring4.1的特性,其作用是在响应体写出前做一些处理,比如修改返回值,加密等。允许在执行@ResponseBody或ResponseEntity控制器方法之后但在使用HttpMessageConverter编写正文之前自定义响应。可以直接在RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver注册实现,或者更有可能在@ControllerAdvice中注解,在这种情况下,它们都会被两者自动检测到。
下面我们来看下这个接口的定义 public interface ResponseBodyAdvice { /** * 此组件是否支持给定的控制器方法返回类型和所选的HttpMessageConverter类型。 * 这个方法返回true后才会执行下面的beforeBodyWrite方法 */ boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType); /** * 在选择HttpMessageConverter之后且在调用其write方法之前调用 */ @Nullable T beforeBodyWrite(@Nullable T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response); }
接口的使用我们直接在Controller进行增强,这里我们增强的是RestController看代码 @RestControllerAdvice(basePackages = "com.kaysanshi") public class ResponseControllerAdvice implements ResponseBodyAdvice