程序员Spring 开发SpringFramework

SpringBoot 使用 hibernate validato

2018-11-26  本文已影响11人  殷天文

本文将全面的介绍如何使用 validator 进行数据校验

本文源码:https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate

目录

1.常用注解
2.简单的实体校验
3.复杂的实体校验
4.自定义注解校验

准备工作

我们只需要引入 spring-boot-starter-web包即可使用

1.常用注解

常用注解

1.简单的实体校验

public class CardDTO {

    @NotBlank
    private String cardId;

    @Size(min = 10, max = 10)
    @NotNull
    private String cardNum; // 卡号

    @Past
    @NotNull
    private Date createDate;

    @Range(max = 3)
    private String cardType;

    // 省略get set
}
@RestController
public class UserController {

    @PostMapping("simple")
    public Object simple(@RequestBody @Valid CardDTO cardDTO) {
        return cardDTO;
    }

}
3. 复杂的实体校验
3.1 嵌套实体校验
public class UserDTO {

    @NotBlank
    private String userId;

    @NotBlank
    private String username;

    private String password;

    @Valid
    private List<CardDTO> cardList;

    //省略 get set
}
3.2 List<DTO> 校验
无效示例

如果我们想校验 一个实体List,如上图所示的这种写法是完全不起效的。

public class ValidList<E> implements List<E> {

    @Valid
    private List<E> list = new ArrayList<>();

    public List<E> getList() {
        return list;
    }

    public void setList(List<E> list) {
        this.list = list;
    }

    // 省略了 实现方法
}
3.3 使用 @Validated 分组校验
public interface Insert {
}

public interface Update {
}
public class GroupCardDTO {

    @NotBlank(groups = {Update.class})
    private String id;

    @NotBlank(groups = {Insert.class})
    private String cardNum;

    @NotNull(groups = {Insert.class, Update.class})
    private Integer cardType;

    //省略 get set
}
    @PostMapping("insert_card")
    public Object insert_card(@RequestBody @Validated(Insert.class) GroupCardDTO card){
        return card;
    }
4.自定义注解校验

当 validator 提供的注解无法满足我们的业务需求,可以通过自定义的方式来实现校验。

需求:校验某字符串必须为大写或者小写
public enum CaseMode {
    UPPER,
    LOWER
}
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target( { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {

    String message() default "";

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

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

    CaseMode value() default CaseMode.LOWER;

}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {

    private CaseMode caseMode;

    @Override
    public void initialize(CheckCase constraintAnnotation) {
        this.caseMode = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        if (value == null || "".equals(value.trim())) {
            return false;
        }

        switch (this.caseMode) {
            case LOWER:
                return value.equals(value.toLowerCase());
            case UPPER:
                return value.equals(value.toUpperCase());
            default:
                return false;
        }

    }

}
备注
本节源码:https://gitee.com/yintianwen7/taven-springboot-learning/tree/master/springboot-validate
上一篇 下一篇

猜你喜欢

热点阅读