Spring中使用Validator进行数据验证

时间:2025-03-11 10:50:46
常用的Validator

@NotBlank 非空校验,表示不能为空,包括null“”的校验,至少包含一个非空字符,适用于CharSequence

@NotNull 非空校验,表示不能为null,适用于任何类型

@NotEmpty 非空校验,表示不能为空字符串或CharSequenceCollectionMapArray不能为空集合

@Min/@Max 最大值、最小值校验

@Size 长度校验,适用于CharSequenceCollectionMapArray

@Email 邮件格式校验

@Pattern 正则校验

基本用法
在实体定义中,属性或构建函数增加相应的注解,如下:
package ;

import ;

import .*;
import ;

/**
 * 用户模型
 *
 * @author 
 * @create 2017-10-19 09:16
 * @contact 563750241
 * @email 563750241@
 */
public class User implements Serializable {

    private static final long serialVersionUID = -1925045206419899653L;
    @NotNull(message = "Id不能为空")
    @Max(value = 1000)
    private Long id;

    @NotEmpty
    @Size(min = 1, max = 10, message = "")
    private String name;

    /**
     * 以ZX开头 用-隔开 以数字结尾
     */
    @TransNoValidator
    private String transNo;

    @NotBlank
    @Email
    private String email;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getTransNo() {
        return transNo;
    }

    public void setTransNo(String transNo) {
        this.transNo = transNo;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
在Controller中,捕捉不符合条件的校验结果
package ;

import ;
import org.;
import org.;
import ;
import ;
import ;
import ;
import ;

import ;

/**
 * 用于学习Bean Validator,包括使用系统自带的Bean Validator 与 自定义Validator
 *
 * @author 
 * @create 2017-10-23 09:33
 * @contact 563750241
 * @email 563750241@
 */
@RestController
public class ValidatorController {

    private static final Logger logger = ();

    @PostMapping(value = "/validator/user/save")
    public User save(@Valid @RequestBody User user, BindingResult result) {
        ().forEach(objectError -> {
            ("==========");
            FieldError fieldError = (FieldError) objectError;
            ("Field: %s Message: %s \n",
                    (),
                    ());
        });
        return user;
    }

}

以上方式,必须针对每个Controller进行分别处理,亦可使用全局异常处理的方式进行统一的拦截,然后转换成适合项目的数据格式,比如JSON

package ;

import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;

/**
 * 异常切面
 *
 * @author 
 * @create 2017-10-23 11:18
 * @contact 563750241
 * @email 563750241@
 */
@RestControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler()
    public Map<String, Object> handleException(Throwable ex) {
        MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
        BindingResult result = ();
        List<FieldError> fieldErrors = ();
        Map<String, Object> errorMap = new HashMap<>(16);
        (objectError -> {
                    FieldError fieldError = (FieldError) objectError;
                    ("Field: %s Message: %s \n",
                            (),
                            ());
                    ((), ());
                }
        );
        return errorMap;
    }

}
自定义Validator
package ;

import ;

import ;
import ;
import ;
import ;
import ;

import static .*;
import static ;

/**
 * TransNoValidator
 *
 * @author 
 * @create 2017-10-23 09:53
 * @contact 563750241
 * @email 563750241@
 */
@Target({ FIELD })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {  })
public @interface TransNoValidator {

    String message() default "{}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

}
Validator消息格式化
  • com.garlic.validation.constraints.TransNoValidator.message=\
    Trans No must start with ZX, and the suffix is numeric.
  • ValidateMessages_zh

    com.garlic.validation.constraints.TransNoValidator.message=\
    交易流水号必须以ZX开头,以数字结尾

相关文章