拦截不到@NotNull异常

拦截不到@NotNull异常

问题描述:

拦截不到@NotNull注解产生的异常,自定义异常可以拦截到,麻烦老师帮忙看下什么原因

相关截图:

https://img1.sycdn.imooc.com//climg/6130fd0a093aabc117220974.jpg

相关代码:

package com.imooc.imoocbbs.exception;

import com.imooc.imoocbbs.common.ApiResponse;
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;

/**
 * 统一异常处理类
 */
@ControllerAdvice //用于拦截异常
public class GlobalExceptionHandler {

    //系统异常处理
    @ExceptionHandler(Exception.class) //规定处理异常类型
    @ResponseBody
    public Object handlerException(Exception e){
        return ApiResponse.err(ImoocBBSExceptionEnum.SYSTEM_ERROR);
    }

    //自定义异常处理
    @ExceptionHandler(ImoocBBSException.class)
    @ResponseBody
    public Object handlerImoocBBSException(ImoocBBSException e){
        return ApiResponse.err(e.getCode(), e.getMsg());
    }

    //参数校验异常处理
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ApiResponse handleMethodArgumentNotVaildException(MethodArgumentNotValidException e){
        return handleBindingResult(e.getBindingResult());
    }

    //绑定出问题时将异常处理成响应类型
    private ApiResponse handleBindingResult(BindingResult result){
        //把异常处理为对外暴露的提示
        //创建异常list
        //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 ApiResponse.err(ImoocBBSExceptionEnum.REQUEST_PARAM_ERROR);
        return ApiResponse.err(ImoocBBSExceptionEnum.REQUEST_PARAM_ERROR.getCode(),list.toString());
    }
}

package com.imooc.imoocbbs.common;

import com.imooc.imoocbbs.exception.ImoocBBSExceptionEnum;

/**
* API通用返回对象
* @param <T>
*/
public class ApiResponse <T>{
//状态码
private Integer status;
//信息
private String msg;
//数据
private T data;

//正常状态码和信息
private static final int OK_CODE = 10000;
private static final String OK_MSG = "SUCCESS";

public ApiResponse(Integer status, String msg, T data) {
this.status = status;
this.msg = msg;
this.data = data;
}

public ApiResponse(Integer status, String msg) {
this.status = status;
this.msg = msg;
}

public ApiResponse() {
this(OK_CODE, OK_MSG);
}

//调用成功
public static <T> ApiResponse success(){ return new ApiResponse();}
public static <T> ApiResponse success(T data){
ApiResponse<T> apiResponse = new ApiResponse<>();
apiResponse.setData(data);
return apiResponse;
}

//调用失败
public static <T> ApiResponse err(Integer code, String msg){
return new ApiResponse(code,msg);
}
public static <T> ApiResponse err(ImoocBBSExceptionEnum exceptionEnum){
return new ApiResponse(exceptionEnum.getCode(),exceptionEnum.getMsg());
}

public Integer getStatus() {
return status;
}

public void setStatus(Integer status) {
this.status = status;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

@Override
public String toString() {
return "ApiResponse{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}

package com.imooc.imoocbbs.controller;

import com.imooc.imoocbbs.common.ApiResponse;
import com.imooc.imoocbbs.model.pojo.User;
import com.imooc.imoocbbs.model.request.LoginRequest;
import com.imooc.imoocbbs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;
/**
* 用户模块控制器
*/

@RestController
public class UserController {
@Autowired
UserService userService;
/**
* 用户登陆
*/
@PostMapping("/login")
public ApiResponse login(HttpSession session, @Valid LoginRequest request){
User user = userService.login(request);
session.setAttribute("IMOOC_MALL_USER", user);
return ApiResponse.success(user);
}
}

package com.imooc.imoocbbs.model.request;

import javax.validation.constraints.NotNull;

public class LoginRequest {
@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "密码不能为空")
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}



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

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

2回答
啃大饼的瓜子脸0_0 2021-09-04 10:28:44
好帮手慕阿园 2021-09-03 14:58:33

同学你好,同学可以在GlobalExceptionHandler类中添加如下代码试试

//表示处理@Valid注解拦截的错误
@ExceptionHandler(BindException.class)
public Object handlerMethodArgumentNotValidException(BindException e) {
return HandleBindingResult(e.getBindingResult());
}

​祝学习愉快~

  • 提问者 今天也要学习呢 #1

    再加上@ResponseBody注解就可以了,谢谢老师
    另外想问下老师什么注解@ExceptionHandler(MethodArgumentNotValidException.class)就不行呢,看视频中5-5的配置是可以的,想问一下什么原因呢


    2021-09-03 17:10:55
  • 同学你好,Controller在接收的参数在进行绑定注解校验规则时会出现此异常,同学的代码中在controller中使用@Valid注解,所以建议同学将该异常进行处理

    祝学习愉快~

    2021-09-03 18:48:04
  • 视频5-5中也使用了@Valid注解,并且用的@ExceptionHandler(MethodArgumentNotValidException.class)就没有问题呢

    https://img1.sycdn.imooc.com//climg/613222f409c2071215000834.jpg

    https://img1.sycdn.imooc.com//climg/613222d909d3f8f614700372.jpg

    2021-09-03 21:28:42
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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