001package run.iget.framework.common.handler;
002
003import org.springframework.beans.factory.annotation.Value;
004import org.springframework.validation.BindException;
005import org.springframework.validation.FieldError;
006import org.springframework.web.bind.annotation.ExceptionHandler;
007import org.springframework.web.bind.annotation.RestControllerAdvice;
008
009import lombok.Setter;
010import lombok.extern.slf4j.Slf4j;
011import run.iget.framework.common.enums.BaseResultEnum;
012import run.iget.framework.common.exception.BusinessException;
013import run.iget.framework.common.resp.ResultResp;
014
015/**
016 * 代码千万行,注释第一行,注释不规范,迭代两行泪
017 * ---------------类描述-----------------
018 * 全局异常处理,统一进行保证返回给前端
019 * ---------------类描述-----------------
020 *
021 * @author 大周
022 * @date 2022/11/11 21:52
023 */
024@Setter
025@Slf4j
026@RestControllerAdvice
027public class GlobalExceptionHandler {
028
029    /**
030     * 是否输出异常信息
031     */
032    @Value("${fast.framework.consoleError:false}")
033    private Boolean consoleError;
034
035    /**
036     * 处理自定义异常
037     */
038    @ExceptionHandler(BusinessException.class)
039    public ResultResp<String> handleException(BusinessException ex) {
040        BaseResultEnum resultEnum = ex.getResultEnum();
041        consoleErrorMsg(ex);
042        return ResultResp.error(resultEnum.getCode(), resultEnum.getDesc());
043    }
044
045    /**
046     * SpringMVC参数绑定,Validator校验不正确
047     */
048    @ExceptionHandler(BindException.class)
049    public ResultResp<String> bindException(BindException ex) {
050        FieldError fieldError = ex.getFieldError();
051        assert fieldError != null;
052        consoleErrorMsg(ex);
053        return ResultResp.error(BaseResultEnum.ERROR_PARAM.getCode(), fieldError.getDefaultMessage());
054    }
055
056    @ExceptionHandler(Exception.class)
057    public ResultResp<String> handleException(Exception ex) {
058        consoleErrorMsg(ex);
059        return ResultResp.error(ex.getMessage());
060    }
061
062    /**
063     * 输出异常信息
064     * @param ex
065     */
066    private void consoleErrorMsg(Exception ex) {
067        if (!Boolean.TRUE.equals(consoleError) || !log.isErrorEnabled()) {
068            return;
069        }
070        log.error(ex.getMessage(), ex);
071    }
072
073}