简述Controller区别
ControllerAdvice:主要用于处理Controller层抛出的异常。这种方式适用于需要将异常信息渲染到页面上的情况。
RestControllerAdvice:专门用于处理Restful API抛出的异常。当Restful API抛出异常时,RestControllerAdvice会自动捕获并处理这些异常。这种方式适用于需要将异常信息以JSON格式返回给前端的情况。
操作如下:
新建ControllerGlobalExceptionHandler类
@RestControllerAdvice("com.saul.web.controller.system") //表明需要处理异常的范围
public class ControllerGlobalExceptionHandler {
@Log(title = "调取接口字段异常", businessType = BusinessType.INSERT)
@ExceptionHandler(value = MethodArgumentNotValidException.class) // 参数异常抛出的异常类型为MethodArgumentNotValidException,这里捕获这个异常
public AjaxResult validExceptionHandler(MethodArgumentNotValidException e){
System.out.println("数据异常处理");
BindingResult bindingResult = e.getBindingResult();
Map<String,String> map = new HashMap<>();
StringBuilder mergerMessage = new StringBuilder("数据校验失败!");
bindingResult.getFieldErrors().forEach((item)->{
String message = item.getDefaultMessage();
mergerMessage.append(message);
mergerMessage.append(";");
// 获取错误的属性字段名
String field = item.getField();
map.put(field,message);
});
return AjaxResult.error(HttpStatus.SAUL_ERROR, mergerMessage.toString(), new ArrayList<>());
}
}
测试
发送一个包含无效数据的请求到MyController的submit方法,确保你的全局异常处理器能够捕获到MethodArgumentNotValidException异常,并将验证失败的字段信息记录到日志中。
public class MyController {
@PostMapping("/submit")
public AjaxResult submit(@RequestBody @Validated MyDto myDto) {
// 处理请求...
return AjaxResult.success();
}
}