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
异常,并且统一异常处理可以正确地捕捉到该异常,并返回错误信息给前台。
希望这个解决方案对您有帮助,如果您有任何问题,请随时提问。