spring boot 的異常統一處理
@RestControllerAdvice
public class GlobalExceptionHandler {
private static Logger logger= LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
public ResData defaultExceptionHandler(HttpServletRequest req, Exception e) throws Exception {
Map<String, String> requestParam = getRequestParam(req);
String ip = WechatCommonParamUtil.getLocalIP(req);
logger.error("defaultExceptionHandler ip:{}, url:{}, requestParam:{}, error:{}", ip, req.getRequestURI(), requestParam, e);
return ResData.fail(ExceptionCode.SERVER_EXCEPTION,"訪問太火爆,服務器開小差了!");
}
private Map<String, String> getRequestParam(HttpServletRequest req) {
Enumeration<String> parameterNames = req.getParameterNames();
Map<String, String> paramMap = new HashMap<>();
while (parameterNames.hasMoreElements()) {
String name = (String) parameterNames.nextElement();
String value = req.getParameter(name);
paramMap.put(name, value);
}
return paramMap;
}
@ExceptionHandler(value = BindException.class)
public ResData bindExceptionHandler(HttpServletRequest req, BindException e) throws Exception {
String message = e.getFieldErrors()
.stream()
.findFirst()
.get()
.getDefaultMessage();
Map<String, String> requestParam = getRequestParam(req);
String ip = WechatCommonParamUtil.getLocalIP(req);
logger.error("bindExceptionHandler ip:{}, url:{}, requestParam:{}, errorMessage:{}", ip, req.getRequestURI(), requestParam, message);
return ResData.fail(ExceptionCode.BIND_EXCEPTION,message);
}
@ExceptionHandler(value = ConstraintViolationException.class)
public ResData constraintViolationExceptionHandler(HttpServletRequest req, ConstraintViolationException e) throws Exception {
String message = e.getMessage();
if (message.contains(":")) {
message = message.split(":")[1].trim();
}
if(message.contains(",")) {
message = message.substring(0, message.lastIndexOf(","));
}
Map<String, String> requestParam = getRequestParam(req);
String ip = WechatCommonParamUtil.getLocalIP(req);
logger.error("constraintViolationExceptionHandler ip:{}, url:{}, requestParam:{}, errorMessage:{}", ip, req.getRequestURI(), requestParam, message);
return ResData.fail(ExceptionCode.CONSTRAINT_VIOLATION_EXCEPTION,message);
}
@ExceptionHandler(value = ServiceException.class)
public ResData serviceExceptionHandler(HttpServletRequest req, ServiceException e) throws Exception {
String message = e.getMessage();
int errorCode = e.getErrorCode();
Map<String, String> requestParam = getRequestParam(req);
String ip = WechatCommonParamUtil.getLocalIP(req);
logger.error("serviceExceptionHandler ip:{}, url:{}, requestParam:{}, errorCode:{}, errorMessage:{}", ip, req.getRequestURI(), requestParam, errorCode, message);
return ResData.fail(errorCode,message);
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResData methodArgumentNotValidExceptionHandler(HttpServletRequest req, MethodArgumentNotValidException e) throws Exception {
String message = e.getBindingResult()
.getFieldErrors()
.stream()
.findFirst()
.get()
.getDefaultMessage();
Map<String, String> requestParam = getRequestParam(req);
String ip = WechatCommonParamUtil.getLocalIP(req);
logger.error("methodArgumentNotValidExceptionHandler ip:{}, url:{}, requestParam:{}, errorMessage:{}", ip, req.getRequestURI(), requestParam, message);
return ResData.fail(ExceptionCode.METHOD_ARGUMENT_EXCEPTION,message);
}