@ControllerAdvice(basePackages = "") 可以扫描@Controller和@Rest Controller的类,basePackages可以配置执行的包扫描
@RestControllerAdvice
只扫描@RestController注解的类
@ExceptionHandler(value = Exception.class) 异常处理拦截异常类型
通过重写的exceptionHandler方法实现异常拦截
package com.xxxx.common.handler;
import com.xxx.common.feedback.ResponseData;
import com.xxx.common.feedback.ResponseDataUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* Description: </br>
* date: 2020/6/30 17:01</br>
*
* @author: Administrator</ br>
* @since JDK 1.8
*/
@ControllerAdvice
@Slf4j
public class AcceptControllerAdvice {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResponseData exceptionHandler(Exception e){
//发生异常进行日志记录,写入数据库或者其他处理
log.error(e.getLocalizedMessage());
e.printStackTrace();//打印堆栈信息,方便定位
//如果是入参校验异常
StringBuilder stringBuilder = new StringBuilder();
if (e instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException e1 = (MethodArgumentNotValidException) e;
BindingResult result = e1.getBindingResult();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
errors.forEach(p ->{
FieldError fieldError = (FieldError) p;
stringBuilder.append(fieldError.getField()+":"+fieldError.getDefaultMessage()+",");
});
}
}else {
stringBuilder.append(e.getLocalizedMessage());
}
return ResponseDataUtil.buildError(stringBuilder);
}
}