全局异常拦截(含自定义异常)

@ControllerAdvice(assignableTypes = {BaseController.class})
@ResponseBody
public class GlobalExceptionAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionAspect.class);

    private Map<String, String> getErrorMesg(BindingResult bindingResult) {
        Map<String, String> validResult = Maps.newHashMap();
        List<FieldError> errors = bindingResult.getFieldErrors();
        errors.forEach(item -> {
            validResult.put(item.getField(), item.getDefaultMessage());
        });
        return validResult;
    }

    /*
     *  400-Bad Request
     */
    //@ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(value = { MethodArgumentNotValidException.class,
            BindException.class,
            MissingServletRequestParameterException.class,
            TypeMismatchException.class })
    public @ResponseBody  WebResultDTO handleValidException(
            Exception e) {
        WebResultDTO result = new WebResultDTO();
        if (e instanceof MethodArgumentNotValidException) {
            BindingResult bindingResult = ((MethodArgumentNotValidException)e).getBindingResult();
            if (bindingResult.hasErrors()) {
                result.setValidResult(getErrorMesg(bindingResult));
            }
        } else if (e instanceof BindException) {
            BindingResult bindingResult = ((BindException)e).getBindingResult();
            if (bindingResult.hasErrors()) {
                result.setValidResult(getErrorMesg(bindingResult));
            }
        } else if (e instanceof MissingServletRequestParameterException) {
            Map<String,String> validResult = new HashMap<>();
            validResult.put(((MissingServletRequestParameterException)e).getParameterName(),"缺少参数");
            result.setValidResult(validResult);
        } else if (e instanceof TypeMismatchException) {
            Map<String,String> validResult = new HashMap<>();
            if(e instanceof MethodArgumentTypeMismatchException){
                validResult.put(((MethodArgumentTypeMismatchException)e).getName(),"参数类型不匹配,应为"+((TypeMismatchException)e).getRequiredType());
            }else{
                validResult.put(((TypeMismatchException)e).getMessage(),"参数类型不匹配,应为"+((TypeMismatchException)e).getRequiredType());
            }
            result.setValidResult(validResult);
        }
        result.setData(false);
        result.setStatus(HttpStatusCode.BAD_REQUEST);
        result.setMsg("参数错误");
        LOGGER.error("参数错误 {} {}", result.getStatus(), result.getValidResult());
        return result;
    }

    /*
     *  503-Service Unavailable
     */
    //@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(RpcException.class)
    public @ResponseBody  WebResultDTO handleRpcException(
            RpcException e) {
        WebResultDTO result = new WebResultDTO();
        result.setStatus(HttpStatus.SERVICE_UNAVAILABLE.value());
        result.setMsg("上游服务不可用");
        LOGGER.error("上游服务不可用", e);
        return result;
    }

    /**
     * 500 - Internal Server Error
     */
    //@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(Exception.class)
    public @ResponseBody WebResultDTO handleException(Exception e) {
        WebResultDTO result = new WebResultDTO();
        Map<String,String> validResult = new HashMap<>();
        validResult.put(e.getClass().getSimpleName(),e.getMessage());
        result.setValidResult(validResult);
        result.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        result.setMsg("未知错误,请联系管理员");
        LOGGER.error("未知错误", e);
        return result;
    }

    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(BusinessException.class)
    public @ResponseBody WebResultDTO handleBusinessException(BusinessException e) {
        WebResultDTO result = new WebResultDTO();
        result.setStatus(e.getCode());
        result.setMsg(e.getMessage());
        LOGGER.error("业务异常 {} {}", result.getStatus(), result.getMsg());
        return result;
    }

}

猜你喜欢

转载自blog.csdn.net/xx897115293/article/details/107975299