@NotEmpty使用方法

Controller
public ResultBody insert(@Validated UserPO entity)

实体类
@NotEmpty(message = "昵称不能为空")
@ApiModelProperty(value = "昵称")
@TableField(value = "nickname")
private String nickname;

统一异常处理
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(BindException.class)
public ResultBody BindException(Exception e) {
    return ResultUtils.success(e);
}

2023-09-20 20:24:49.875 [http-nio-9000-exec-3] WARN o.s.w.s.m.support.DefaultHandlerExceptionResolver - Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'userPO' on field 'nickname': rejected value []; codes [NotEmpty.userPO.nickname,NotEmpty.nickname,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userPO.nickname,nickname]; arguments []; default message [nickname]]; default message [昵称不能为空]]

统一异常处理无法捕捉,在前台返回的是400

【以下回答由 GPT 生成】

解决方案:

问题的原因是统一异常处理没有正确地捕捉到@NotEmpty注解的验证异常。为了解决这个问题,可以在统一异常处理中添加对 MethodArgumentNotValidException 的处理,该异常会在参数验证不通过时抛出。

下面是修改后的代码示例:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(value = {BindException.class, MethodArgumentNotValidException.class})
    public ResultBody handleValidationException(Exception e) {
        List<String> errorMessages = new ArrayList<>();
        if (e instanceof BindException) {
            BindException bindException = (BindException) e;
            for (ObjectError error : bindException.getBindingResult().getAllErrors()) {
                errorMessages.add(error.getDefaultMessage());
            }
        } else if (e instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;
            for (ObjectError error : validException.getBindingResult().getAllErrors()) {
                errorMessages.add(error.getDefaultMessage());
            }
        }
        return ResultUtils.failure(HttpStatus.BAD_REQUEST.value(), "参数验证失败", errorMessages);
    }
}

现在,当使用@NotEmpty注解验证昵称字段时,如果昵称为空,会抛出MethodArgumentNotValidException异常,并且统一异常处理可以正确地捕捉到该异常,并返回错误信息给前台。

希望这个解决方案对您有帮助,如果您有任何问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^