Spring全局异常捕获类

 
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());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值