目录
1.统一数据格式返回
2.统一异常处理
3.接口返回String类型问题
1.统一数据格式返回
- 添加@ControllerAdvice注解
- 实现ResponseBodyAdvice接口
- 重写supports方法,beforeBodyWrite方法
/**
* 统一数据格式返回的保底类 对于一些非对象的数据的再统一 即非对象的封装成对象再返回
*/
@ControllerAdvice //控制器通知类
public class ResponseAdvice implements ResponseBodyAdvice {
@Autowired
private ObjectMapper objectMapper;
/**
* 开关
* true表示返回结果作统一处理
* false不处理
*/
@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 AjaxResult) {
return body;
}
// 字符串比较特殊 是由于序列化问题导致
// 对于字符串类型,可以使用SpringBoot提供的Jackson实现信息的序列化
if(body instanceof String) {
return objectMapper.writeValueAsString(body);
}
return AjaxResult.success("",body);
}
}
String类型需要特殊处理的原因:类型转换异常。即序列化问题。
由于我设置了统一返回类(code,msg,data),String类型的数据在上面第一步(返回的body中)就已经被包装成一个对象了,后续传参也都是泛型,直到调用 addDefaultHeaders 方法,接收却是String类型的。对象是不能自动转成String类型的。并且是String类型才会走上面的流程。
解决办法就是使用SpringBoot提供的Jackson库,可以将对象转成Json格式的字符串。即序列化。
2.统一异常处理
- 加ControllerAdvice注解(控制器通知类)
- 加ResponseAdvice注解(类上或方法上,表示返回的是非页面的数据)
- 加ExceptionHandler注解(在每个方法上加)
/**
* 捕获项目运行中出现的异常,并进行统一异常的返回
* 捕获流程 先捕获匹配具体的异常,没找到(即我们没定义),再往上到RunTimeException,没匹配到,就再往上到Exception 即按照异常继承关系往上找
* 能不能捕获到具体的异常,要看我们自定义的方法中有没有写具体的异常
*/
@ResponseBody //务必加 才能返回数据类型 不加返回页面 可以加类上或方法上
@ControllerAdvice
public class ErrorHandler {
@ExceptionHandler
public AjaxResult handler(Exception e) {
return AjaxResult.fail("内部发生异常");
}
@ExceptionHandler
public AjaxResult handler(RuntimeException e) {
return AjaxResult.fail("内部发生异常");
}
@ExceptionHandler
public AjaxResult handler(NullPointerException e) {
return AjaxResult.fail("空指针异常");
}
@ExceptionHandler
public AjaxResult handler(ArithmeticException e) {
return AjaxResult.fail("算术异常");
}
}
3.接口返回String类型问题
接口返回String类型的数据时,需要转Json格式 。所以尽量少用,直接将String类型的数据包装在对象中返回即可。