统一数据返回格式的实现
@ControllerAdvice +继承 ResponseBodyAdvice
@ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice { /** * 内容是否需要重写(通过此方法可以选择性部分控制器和方法进行重写) * 返回 true 表示重写 */ @Override public boolean supports(MethodParameter returnType, Class converterType) { return false; } //方法返回之前调用此方法 @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 构造统一返回对象 HashMap<String, Object> result = new HashMap<>(); result.put("success", 1); result.put("message", ""); result.put("data", body); return result; } }
存在的问题:controller请求映射方法,返回值如果是null,不会执行统- -响应封装
解决办法
HandlerMethodReturnValueHandler
public class RequestResponseBodyMethodProcessorWrapper implements HandlerMethodReturnValueHandler { private final HandlerMethodReturnValueHandler delegate; public RequestResponseBodyMethodProcessorWrapper(HandlerMethodReturnValueHandler delegate) { this.delegate = delegate; } @Override public boolean supportsReturnType(MethodParameter returnType) { return delegate.supportsReturnType(returnType); } @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { //returnValue是Controller请求方法执行完,返回值 if(!(returnValue instanceof ResponseResult)){//返回值本身就是需要的类型,不进行处理 ResponseResult json = new ResponseResult(); json.setSuccess(true); json.setData(returnValue); if(returnValue instanceof Page){ Page page = (Page) json.getData(); json.setTotal(page.getTotal()); } returnValue = json; } delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest); } }