统一异常处理类GlobalExceptionHandler里增加参数不合法异常处理后不起作用

统一异常处理类GlobalExceptionHandler里增加参数不合法异常处理后不起作用

统一异常处理类GlobalExceptionHandler里增加参数不合法异常处理后不起作用,明确的错误信息还只是显示在控制台,通过postman返回的错误信息还是“系统异常”

package com.example.springbootprj0322.exception;

import com.example.springbootprj0322.common.ApiRestResponse;
import com.example.springbootprj0322.filter.WebLogAspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

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

/**
 * @ClassName GlobalExceptionHandler
 * @description: 用来统一处理异常,异常分为两类:系统异常和业务异常
 * @author: 自己名字
 * @create: 2023-03-31 15:46
 **/
@ControllerAdvice//@ControllerAdvice注解的作用:用于拦截异常
public class GlobalExceptionHandler {

    private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /*处理系统异常*/
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ApiRestResponse handlerException(Exception e){
        log.error("Default Exception:",e);
        return ApiRestResponse.error(ExceptionEnum.SYSTEM_ERROR);
    }

    /*处理业务异常*/
    @ExceptionHandler(MallException.class)
    @ResponseBody
    public ApiRestResponse handlerMallException(MallException e){
        log.error("MallException:",e);
        return ApiRestResponse.error(e.getCode(),e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ApiRestResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        log.error("MethodArgumentNotValidException:",e);
        return handleBindingResult(e.getBindingResult());
    }

    public ApiRestResponse handleBindingResult(BindingResult result){
        //把异常处理为对外暴露的提示
        List<String> list=new ArrayList<>();
        if (result.hasErrors()) {
            List<ObjectError> allErrors=result.getAllErrors();
            for (ObjectError objectError:allErrors) {
                System.out.println("111");
                String message=objectError.getDefaultMessage();
                list.add(message);
            }
        }
        if (list.size()==0) {
            return ApiRestResponse.error(ExceptionEnum.REQUEST_PARAM_ERROR);
        }
        System.out.println("222");
        return ApiRestResponse.error(ExceptionEnum.REQUEST_PARAM_ERROR.getCode(),list.toString());

    }

}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2023-04-17 10:05:21

同学你好,1、建议同学将返回类型修改为Object,如下所示:

https://img1.sycdn.imooc.com//climg/643ca82b092d760907240478.jpg

2、当postman中显示的是“系统异常”,则是因抛出的异常被handlerException处理了。则建议同学查在控制器代码中抛出的异常是否是自定义异常,如下所示:如果不是,则建议同学进行修改。

https://img1.sycdn.imooc.com//climg/643ca9120976361b08270431.jpg

https://img1.sycdn.imooc.com//climg/643ca8f409d71c0608120464.jpg

3、如果是,则有可能是项目缓存的问题,建议同学清除idea缓存,或者重启电脑试一下(避免是postman的问题)。

祝学习愉快!

  • 提问者 慕仰4837686 #1

    https://img1.sycdn.imooc.com//climg/643d091309e0caf514230710.jpg

    上面的异常都能正常显示。

    但是使用@Valid时遇到的参数不合法异常信息只在控制台显示,在postman里还是显示系统异常

    https://img1.sycdn.imooc.com//climg/643d0a3a0912ed6f16510860.jpg

    https://img1.sycdn.imooc.com//climg/643d0a5509a6cf5212740708.jpg

    2023-04-17 16:59:58
  • 好帮手慕小尤 回复 提问者 慕仰4837686 #2

    同学你好,1、建议同学修改传递的参数的方式,然后重新测试试一下。在源代码中测试同学代码,通过json格式传递参数是可以捕获到抛出的MethodArgumentNotValidException异常,并进行处理。如下所示

    https://img1.sycdn.imooc.com//climg/643d0dd6094d843a07690691.jpg

    https://img1.sycdn.imooc.com//climg/643d0dbf09620e3f11760157.jpg

    https://img1.sycdn.imooc.com//climg/643d0e2b0945a2a918180109.jpg

    2、如果还存在问题,则建议同学查看CategoryController中的代码,如下所示:

    https://img1.sycdn.imooc.com//climg/643d0e800907f0ee08410487.jpg

    3、同学也可以测试课程源代码试一下,查看是否存在对应的问题。如果不存在,则可能是同学代码问题,或者是缓存的问题,建议同学清除缓存或与课程源代码进行对比,查看哪里存在差异。

    祝学习愉快!

    2023-04-17 18:29:15
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师