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 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 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 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 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 validateExceptionHandler(ConstraintViolationException e) {
        Set> 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());
    }
}

你可能感兴趣的:(java,servlet,spring)