统一数据的返回格式:
对从Controller中返回的数据进行统一的数据加工处理,避免修改太多。
package com.syx.book.config;
import com.syx.book.Model.Result;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return Result.success(body);
}
}
这时候要实现ResponseBodyAdvice接口,重写ResponseBodyAdvice的方法,并且记得加上@ControllerAdvice注解。
这里的returnType可以拿到前面的方法,可以设置哪些需要处理,哪些不需要。
- support方法就是表示对哪些方法的结果进行统一处理,返回true表示处理,会执行support代码下面的逻辑,否则不处理。
- beforeBodyWrite是用于写入body之前要进行处理,响应正文处理。
复习一下响应的内容:

通过fiddler抓包我们发现,第一行是协议内容以及返回的结果 第二行到下边空行是响应头,以key value形式存储 最后一行是正文也就是我们的ResponseBody(正文)。
上面的ResponseBodyAdvice也就是对正文进行处理的。
package com.syx.book.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.syx.book.Model.Result;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
@Autowired
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Result){
return body;
}
if (body instanceof String){
return objectMapper.writeValueAsString(Result.success(body));
}
return Result.success(body);
}
}
问题一:
如果我们在这里加上返回Result.success的话:就会出现嵌套的问题
解决方法:
将Result类排除在外。
问题二:
如果返回的是String类型的话,后端就会报错,我的代码没有实现返回String类型,这里简单介绍一下:
解决方案:
注入objectMapper,并且使用该方法。普通对象返回都没有问题,只有String类型有问题 。