@ExceptionHandler捕获不到MethodArgumentNotValidException

@ExceptionHandler捕获不到MethodArgumentNotValidException

package com.imooc.mall.exception;

import com.imooc.mall.common.ApiRestResponse;
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;

/**
 * 描述:     处理统一异常的handler
 */
@ControllerAdvice
public class GlobalExceptionHandler {

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

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleException(Exception e) {
        log.error("Default Exception: ", e);
        return ApiRestResponse.error(ImoocMallExceptionEnum.SYSTEM_ERROR);
    }

    @ExceptionHandler(ImoocMallException.class)
    @ResponseBody
    public Object handleImoocMallException(ImoocMallException e) {
        log.error("ImoocMallException: ", 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> errorMessage = new ArrayList();
//        if (result.hasErrors()){
//            List<ObjectError> allErrors = result.getAllErrors();
//            for (ObjectError list: allErrors) {
//                String message = list.getDefaultMessage();
//                errorMessage.add(message);
//            }
//        }
//        if (errorMessage.size() == 0){
//            return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR);
//        }
//
//        return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR.getCode() , errorMessage.toString());
//    }

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

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


}
package com.imooc.mall.controller;

import com.imooc.mall.common.ApiRestResponse;
import com.imooc.mall.common.Constant;
import com.imooc.mall.exception.ImoocMallExceptionEnum;
import com.imooc.mall.model.pojo.User;
import com.imooc.mall.model.requert.AddCategoryReq;
import com.imooc.mall.service.CategoryService;
import com.imooc.mall.service.UserService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

@RestController
public class CategoryController {

    @Resource
    UserService userService;

    @Resource
    CategoryService categoryService;

    @PostMapping("/admin/category/add")
    public ApiRestResponse addCategory(HttpSession session , @Valid AddCategoryReq addCategoryReq){
//        if (addCategoryReq.getName() == null ||addCategoryReq.getType() == null
//         || addCategoryReq.getOrderNum() == null ||addCategoryReq.getParentId() == null){
//           return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_Category);
//        }

        User user = (User)session.getAttribute(Constant.IMOOC_MALL_USER);

        if (user == null){
          return   ApiRestResponse.error(ImoocMallExceptionEnum.NEED_LOGIN);
        }

        boolean f = userService.checkAdminRole(user);

        if (f){

            categoryService.addCategory(addCategoryReq);
            return ApiRestResponse.success();

        }else {
          return    ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN);
        }



    }
}
package com.imooc.mall.model.requert;

import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class AddCategoryReq {

    @NotNull
    @Size(min = 2 , max = 5)
    private String name;

    @NotNull
    @Max(3)
    private Integer type;

    @NotNull
    private Integer parentId;

    @NotNull
    private Integer orderNum;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public Integer getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(Integer orderNum) {
        this.orderNum = orderNum;
    }
}

相关代码按照课程上面的写了但是返回的却是

相关截图:

https://img1.sycdn.imooc.com//climg/64df241f09a33f7a19171000.jpg

相关截图:

https://img1.sycdn.imooc.com//climg/64df2c40090139c018880414.jpg

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

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

1回答
好帮手慕小尤 2023-08-18 18:44:30

同学你好,1、建议同学添加@RequestBody注解。

https://img1.sycdn.imooc.com//climg/64df4b8809d41e5a07540291.jpg

2、同学查看具体的异常信息是否是MethodArgumentNotValidException异常。如果不是,则是无法捕获到的。

祝学习愉快!

  • 提问者 醉上西楼 #1

    加上@RequestBody好像还是不行,我统一的异常处理方法去掉后他报的的异常是BindException

    https://img1.sycdn.imooc.com//climg/64e3043d09005b7919010957.jpg

    为啥我的不是MethodArgumentNotValidException呢

    2023-08-21 14:30:21
  • 提问者 醉上西楼 #2

    https://img1.sycdn.imooc.com//climg/64e30566095113aa17920892.jpg

    https://img1.sycdn.imooc.com//climg/64e305800966102a18010853.jpg

    我改成了BindException发现可以捕获,为啥我和老师报的异常会不一样呢

    2023-08-21 14:35:43
  • 好帮手慕小尤 回复 提问者 醉上西楼 #3

    同学你好,1、因同学使用的是表单提交,使用@Valid,前端提交的方式为表单提交,当出现问题时报BindException异常。前端提交的方式为json格式,出现 MethodArgumentNotValidException异常。同学可以根据课程使用json格式进行提交试一下。如下所示:

    https://img1.sycdn.imooc.com//climg/64e30d1c09c4d22d10490491.jpg

    2、在提问时建议同学在当前小节进行提问,这样可以关联到小节,便于老师定位问题。

    祝学习愉快!

    2023-08-21 15:08:21
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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