java全局错误封装统一返回类

该博客主要介绍了一个全局异常处理类`GlobalExceptionAdviceHandler`,用于捕获和处理Spring MVC中的各种异常。异常处理包括:业务异常、HTTP请求方法不支持、JSON解析错误、参数验证错误和权限拒绝等,并返回统一的HttpResult。此外,还提供了参数校验错误的详细信息处理方法。
摘要由CSDN通过智能技术生成
import com.alibaba.fastjson.JSONException;
import com.huaching.xa.campus.basic.c_enum.HttpResultEnum;
import com.huaching.xa.campus.basic.c_exception.BusinessException;
import com.huaching.xa.campus.basic.result.HttpResult;
import com.huaching.xa.campus.basic.util.StrTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
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.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.List;


/**
 * <p>全局错误封装</p>
 * <p>全局错误封装定义在这里</p>
 *
 */
@RestControllerAdvice
@Component
public class GlobalExceptionAdviceHandler {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     *<p>异常返回处理/p>
     *
     * @param exception:异常
     * @return HttpResult
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public HttpResult<Object> handleRequestError(Exception exception) {
        return dealWithError(exception);
    }


    /**
     *<p>异常返回处理-业务执行/p>
     *
     * @param ex:异常
     * @return HttpResult
     */
    private HttpResult<Object> dealWithError(Exception ex){
        logger.debug("错误信息!",ex);

        if (ex instanceof BusinessException){
            BusinessException businessException = (BusinessException) ex;
            return HttpResult.aOtherResult(businessException.getHttpResultEnum(), businessException.getOtherObjResult());
        }

        if (ex instanceof HttpRequestMethodNotSupportedException){
            return  HttpResult.aOtherResult(HttpResultEnum.REQUEST_METHOD_TYPE_RRROR, ex.getMessage());
        }

        if (ex instanceof JSONException || ex instanceof HttpMessageConversionException){
            return HttpResult.aOtherResult(HttpResultEnum.REQUEST_PARAM_CONVERT_RRROR, ex.getMessage());
        }

        if (ex instanceof MethodArgumentNotValidException){
            return HttpResult.aOtherResult(HttpResultEnum.REQUEST_PARAM_RRROR, methodArgNotValid(((MethodArgumentNotValidException)ex).getBindingResult()));
        }

        if (ex instanceof AccessDeniedException){
            return HttpResult.aOtherResult(HttpResultEnum.USER_NO_ACCESS, ex.getMessage());
        }

        return HttpResult.aOtherResult(HttpResultEnum.SYSTEM_RRROR, ex.getMessage());
    }


    /**
     *<p>参数校验错误/p>
     *
     * @param result:BindingResult
     * @return String:拼接的错误内容
     */
    private String methodArgNotValid(BindingResult result){
        String err = StrTool.EMPTY_STR;
        if (result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            List<String> allErrorDesc = new ArrayList<>();
            allErrors.forEach(p -> {
                FieldError fieldError = (FieldError) p;
                allErrorDesc.add("{错误字段["+fieldError.getField()+"],错误内容["+fieldError.getDefaultMessage()+"]}");
            });
            err = StrTool.join(allErrorDesc,StrTool.EMPTY_STR);
        }
        return err;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值