java 实体字段校验@Valid - @NotNull @NotEmpty @NotBlank - ValidExceptionHandler

时间:2025-03-11 07:23:20

java 实体字段校验@NotNull @NotEmpty @NotBlank

注意在使用 @NotBlank 等注解时,一定要和 @valid 一起使用,否则 @NotBlank 不起作用。

1.@NotNull

不能为 null,但可以为 empty,一般用在 Integer 类型的基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制.

一个 BigDecimal 的字段使用字段校验标签应该为 @NotNull。

在使用 @Range 一般用在 Integer 类型上可对字段数值进行大小范围的控制。

2.@NotEmpty

不能为 null,且长度必须大于 0,一般用在集合类上或者数组

3.@NotBlank

只能作用在接收的 String 类型上,注意是只能,不能为 null,而且调用 trim() 后,长度必须大于 0即:必须有实际字符

在使用 @Length 一般用在 String 类型上可对字段数值进行最大长度限制的控制。

@Valid

Controller层
@PoseMapping(value="/XXX ", produces="application/json")
@Operation(description="")
public ResponseEntity<?>  XXX (@Valid @RequestBody requestDto request, @RequestHeaders Headers headers ){
	Sring user = (headers);
//...}
Service层
checkRequest(Dto dto){
if(!()){
	throw new XXException(msg)
	//throw new XXException(, msg)
}
if(!()){
}
if(!()){
}
Dto层
XXXrequestDto(){

//注解用于处理一些通用的验证
@NotBlank(message="xx cannot be null")
@JsonProperty("action")
private String action;

//valid()用于处理一些分情况的验证
public boolean valid(){

}
public boolean validForAdd(){
return StringUtils. isNotBlank(xxName) ;
}
public boolean validForEdit(){
return XXId !=null;
}
}

Example

String name = null;
@NotNull: false
@NotEmpty: false
@NotBlank: false

String name = “”;
@NotNull: true
@NotEmpty: false
@NotBlank: false

String name = " ";
@NotNull: true
@NotEmpty: true
@NotBlank: false

String name = “Great answer!”;
@NotNull: true
@NotEmpty: true
@NotBlank: true

ValidExceptionHandler

@Valid注解校验必填字段返回错误信息@Valid 校验必填字段,当参数非法时,抛出异常,然后返回统一的错误信息

  1. 全局异常处理 使用 @ControllerAdvice 实现全局异常处理,只需要定义类,添加该注解即可定义方式如下:
/**
 * 全局校验异常处理
 * */
@ControllerAdvice
public class ValidExceptionHandler {
 
    /**
     * 以 JSON 格式返回校验异常信息
     * */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler()
    @ResponseBody
    public Map<String, String> handleValidationException(MethodArgumentNotValidException e) {
        Map<String, String> errors = new HashMap<>();
        ()
                .getAllErrors()
                .forEach(error -> {
                    String fieldName = ((FieldError)error).getField(); // 字段名
                    String errorMessage = (); // 校验失败信息
                    (fieldName, errorMessage);
                });
        return errors;
    }
}