目录
1. ResponseBodyAdvice
2. supports方法
3. beforeBodyWrite方法
4. 实践
Spring MVC的ResponseBodyAdvice是Spring 4.1版本中引入的一个接口,它允许在Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后,对自定义响应中的内容进行处理。
具体来说,当Controller方法返回一个值时,该值会作为入参传递给ResponseBodyAdvice的beforeBodyWrite()方法。在beforeBodyWrite()方法中,你可以对返回值进行一些定制操作,例如对返回值进行一层封装,然后再将其写入到response中。
ResponseBodyAdvice只支持@ResponseBody注解的Controller方法,因此如果Controller方法中没有@ResponseBody注解,ResponseBodyAdvice无法对其返回值进行处理。
使用ResponseBodyAdvice可以实现以下两个主要功能:
使用ResponseBodyAdvice的方法有两种:
总的来说,ResponseBodyAdvice是Spring MVC中一个非常有用的接口,它可以对Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后自定义响应中的内容进行处理,从而实现统一处理http接口返回值结构和加密处理等功能。
有两个比较重要的方法进行讲解。
Spring MVC的ResponseBodyAdvice接口中的supports方法主要是用于判断是否符合处理条件。这个方法的返回值是一个布尔值,当返回值为true时,会调用beforeBodyWrite方法对返回值进行处理,否则不进行处理。
具体来说,当一个Controller方法返回一个值时,该值会作为参数传递给supports方法。在supports方法中,你可以编写自己的逻辑来判断是否需要对返回值进行处理。如果返回true,则将返回值传递给beforeBodyWrite方法,在beforeBodyWrite方法中对返回值进行处理后,再将其写入response中。
一般来说,supports方法的实现会比较简单,只需要根据特定的条件判断是否需要对返回值进行处理即可。例如,如果需要对返回值进行加密处理,可以在supports方法中判断请求的url是否符合加密处理的条件,如果符合则返回true,否则返回false。
需要注意的是,supports方法只判断是否需要对返回值进行处理,并不会对Controller方法的返回值类型进行限制。因此,如果Controller方法返回一个自定义类型,需要自行实现supports方法来支持对该类型的处理。
Spring MVC的ResponseBodyAdvice接口中的beforeBodyWrite方法是在Controller控制器中@ResponseBody修饰的方法或ResponseEntity执行之后,对自定义响应中的内容进行处理的具体实现方法。
具体来说,当Controller方法返回一个值时,该值会作为参数传递给supports方法进行判断是否需要处理。如果返回true,则将返回值作为参数传递给beforeBodyWrite方法。在beforeBodyWrite方法中,你可以编写自己的逻辑来对返回值进行处理,例如对返回值进行一层封装、加密处理等,然后将处理后的结果写入response中返回给客户端。
一般来说,beforeBodyWrite方法的实现会比较复杂,需要详细的逻辑来对返回值进行处理。例如,如果需要对返回值进行加密处理,可以在beforeBodyWrite方法中获取加密秘钥,然后对返回值进行加密处理,最后将加密后的结果写入response中返回给客户端。
需要注意的是,beforeBodyWrite方法的参数中包括了Request对象和Response对象,可以从中获取到请求和响应的相关信息。因此,在实现beforeBodyWrite方法时,可以根据需要对请求和响应进行相应的处理。
总的来说,Spring MVC的ResponseBodyAdvice接口中的beforeBodyWrite方法是实现自定义响应处理的核心方法,通过它可以将返回值进行一层封装、加密处理等操作,最终将处理后的结果写入response中返回给客户端。
// 1
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResultResponse {
boolean enable() default true;
}
// 2
@RestControllerAdvice
@RequiredArgsConstructor
public class ResponseBodyAdvice implements ResponseBodyAdvice
实际开发中Controller继承BaseController就可用了。