验证

1.Spring Validator

简介

​ Spring Framework 提供了用于校验对象的Validator 接口,在校验过程中,与 Errors 对象配合。校验器可以通过Errors 对象报告校验失败的信息。

实现模式

实现 org.springframework.validation.Validator接口

实现 supports 方法判断是否需要支持校验

​ 当方法返回 false时,视作不予校验

实现 validate 方法,判断 target 参数是否校验合法

​ 当校验非法时,通过Errors 对象返回

实现 MessageCodesResolver 或重用框架实现,完成错误信息编码化

辅助

使用工具类 ValidationUtils , 辅助通用校验逻辑

自定义校验器

/**
 * Created by LiHaiNan on 上午 10:52 2018/7/13 0013
 */
@Data
public class Person{
    private String id;
    private String name;
    private String sex;
}
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/**
 * Created by LiHaiNan on 下午 5:59 2018/7/16 0016
 */
public class PersonValidator implements Validator{
    //是否支持校验
    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }
    //验证逻辑
    @Override
    public void validate(Object target, Errors errors) {
        Person person=Person.class.cast(target);
        if (StringUtils.isEmpty(person.getName())){
            errors.reject("person.name.not.null","名字不能为空");
        }
    }
}

2.Bean Validation(目前常用方式)

常用注解

@Valid

@NotNull

@Null

@Size

@Min

@Max

自定义注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * describe:
 *
 * @author LiHaiNan
 * @date 下午 6:54 2018/7/17 0017
 */
@Target(value = {ElementType.FIELD,ElementType.METHOD})
@Retention(value= RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {PersonNameValidator.class})
public @interface PersonName {
    String message() default "";
    Class[] groups() default { };

    Class[] payload() default { };

    String prefix() default "lihainan-";
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * describe:
 *
 * @author LiHaiNan
 * @date 下午 7:10 2018/7/17 0017
 */
public class PersonNameValidator implements ConstraintValidator<PersonName,String> {
    private String prefix;

    @Override
    public void initialize(PersonName constraintAnnotation) {
        prefix=constraintAnnotation.prefix();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.startsWith(prefix);
    }
}

你可能感兴趣的:(java进阶篇)