文章目录
- 1. 使用
- 2. 字符串问题
- 2.1 解决方法:
- 2.2 问题分析
有时候后端返回的响应可能是String,Boolean之类的类型,但是我们希望响应将可能描述清除,如失败的原因等
由于一次只能返回一个对象,因此就要将返回结果封装起来
@Data
public class Result<T> {
private ResultCodeEnum code;
private String msg;
private T data;
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(ResultCodeEnum.SUCCESS);
result.setMsg("成功");
result.setData(data);
return result;
}
public static <T> Result<T> fail(String errMsg) {
Result result = new Result();
result.setCode(ResultCodeEnum.FAIL);
result.setMsg(errMsg);
result.setData(null);
return result;
}
public static <T> Result<T> paramError() {
Result result = new Result();
result.setCode(ResultCodeEnum.ParamERROR);
result.setMsg("参数错误");
result.setData(null);
return result;
}
}
但是对于每个请求的响应,都要进行这样的封装,就会很麻烦
Spring提供了统一返回数据格式的功能
1. 使用
统一返回的数据格式使用@ControllerAdvice
,
实现类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);
}
}
supports
方法:判断是否要执行beforeBodyWrite
方法.true为执行,false就不执行,可以从returnType
中获取类名和方法名,可以选择哪些类或哪些方法的Response要进行处理beforeBodyWrite
:对Response方法进行具体的操作处理
2. 字符串问题
如果我们的接口是这样的
此时访问:
看到日志:
提到Result不能被映射到String
2.1 解决方法:
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(body instanceof String){
try {
if("SUCCESS".equals(body)){
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return objectMapper.writeValueAsString(Result.success(body));
}else {
return objectMapper.writeValueAsString(Result.paramError());
}
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
return Result.success(body);
}
就是要对String的返回类型进行特殊处理,转成JSON字符串
2.2 问题分析
参考博客:关于Spring统一返回数据格式中String的问题