最近在学习springboot,看到了封装返回值这块,了解到了ResponseBodyAdvice接口
作用:
ResponseBodyAdvice是spring4.1的新特性,其作用是在响应体写出之前做一些处理,比如,修改返回值、加密等。
接口方法
ResponseBodyAdvice接口一提供了两个方法
- support,通过supports方法,我们可以选择哪些类,或者哪些方法要对response进行处理,其余的则不处理。
- beforeBdoyWrite,在该方法里,为对response处理的具体代码。
具体实现代码
@RestControllerAdvice(basePackages = {"src.main.java.controller"})
public class ControllerResponseAdvice implements ResponseBodyAdvice {
//过滤已经被ResultData封装好的数据,以及标注了NotControllerResponseAdvice的数据
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return !(methodParameter.getParameterType().isAssignableFrom(ResultData.class) ||
methodParameter.hasMethodAnnotation(NotControllerResponseAdvice.class));
}
@Override
public Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//当返回值为string的时候,需单独处理
if (methodParameter.getParameterType().equals(String.class)){
ObjectMapper object = new ObjectMapper();
try{
return object.writeValueAsString(new ResultData(data));
}catch(JsonProcessingException e){
throw new APIException(ResultCode.RESPONSE_ERR, e.getMessage());
}
}
return new ResultData(data);
}
}