package com.xiaolin.contract.controller.advice;
import com.xiaolin.contract.service.RobotService;
import com.xiaolin.contract.util.ContractAppCode;
import com.xiaolin.contract.util.ContractException;
import com.xiaolin.contract.util.LocaleMessage;
import com.xiaolin.framework.common.RemoteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.dao.DataAccessException;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.util.NestedServletException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.sql.SQLException;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 全局异常处理
*
* @author
* @date 2022/3/23 19:45
*/
@Slf4j
@RestControllerAdvice
class GlobalExceptionHandler {
/**
* VO校验异常,分隔符
*/
public static final String SEMICOLON = ";";
@Resource(name = "resultCodeLocaleMessage")
LocaleMessage resultCodeLocaleMessage;
@Autowired
private
RobotService robotService;
@ExceptionHandler(BindException.class)
public RemoteResult<Void> handlerBindExceptionHandler(HttpServletRequest req, final BindException e) {
log.error(req.getServletPath() + " Bind Exception", e);
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";"));
return new RemoteResult<>(ContractAppCode.REQUEST_PARAM_ERROR.getErrorAppCode(), message);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public RemoteResult<Void> handlerMethodArgumentNotValidException(HttpServletRequest req, final MethodArgumentNotValidException e) {
log.error(req.getServletPath() + "MethodArgumentNotValid Exception", e);
String message = e.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(";"));
return new RemoteResult<>(ContractAppCode.REQUEST_PARAM_ERROR.getErrorAppCode(), message);
}
@ExceptionHandler(ContractException.class)
public RemoteResult<Void> handlerBusinessException(HttpServletRequest req, final ContractException e) {
Locale locale = RequestContextUtils.getLocale(req);
if(Locale.CHINESE.equals(locale)){
return new RemoteResult<>(e.getErrCode(), e.getMessage());
}
return new RemoteResult<>(e.getErrCode(), resultCodeLocaleMessage.getMessage(e.getErrCode(), e.getArgs(), RequestContextUtils.getLocale(req)));
}
/**
* 全局异常处理器
* */
@ExceptionHandler(Exception.class)
public RemoteResult<Void> globalException(Exception ex) {
log.error("globalException拦截错误信息:{}",ex.getMessage(),ex);
robotService.sendRobot("全局异常拦截通知", ex.getMessage());
return new RemoteResult<>("9999","内部开发错误");
}
/**
* 违反参数的校验约束
* @param e 具体异常
* @return
* @date 2023/4/12
* @author
* @description
*/
@ExceptionHandler(value = ConstraintViolationException.class)
public RemoteResult<String> validateExceptionHandler(ConstraintViolationException e) {
Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
StringBuilder errMessage = new StringBuilder();
for (ConstraintViolation<?> constraintViolation : constraintViolations) {
errMessage.append(constraintViolation.getMessage());
errMessage.append(SEMICOLON);
}
log.error("GlobalExceptionHandler.validateExceptionHandler() -校验未通过- ",e);
return new RemoteResult<>("9999", "校验未通过", errMessage.toString());
}
}
Spring全局异常捕获类
于 2023-04-13 16:43:44 首次发布