美文网首页
SpringBoot2 - validator

SpringBoot2 - validator

作者: 朱穆朗玛 | 来源:发表于2018-06-26 10:13 被阅读0次

构建项目

  1. 访问地址:http://start.spring.io
  2. 添加Web依赖

SpringBoot的Web组件内部集成了hibernate-validator

内置验证

直接使用hibernate-validator可以进行数据校验

@AssertTrue // 用于Boolean字段,该字段只能为true
@AssertFalse // 用于Boolean字段,该字段只能为false
@CreditCardNumber // 信用卡号验证
@DecimalMax // 只能小于或等于该值
@DecimalMin // 只能大于或等于该值
@Digits(integer=2, fraction=20) // 检查是否是一种数字的整数、分数,小数位数的数字
@Email // 验证email地址
@Future // 检查该字段的日期是否属于将来的日期
@Length(min=, max=) // 检查所属字段的长度是否在min和max之间,只能用于字符串
@Max // 该字段的值只能小于或等于该值
@Min // 该字段的值只能大于或等于该值
@NotNull // 不能为null
@NotBlank // 不能为空,忽略空格
@NotEmpty // 不能为空
@Null // 检查该字段为空
@Past // 检查该字段的日期是否属于过去
@Size(min=, max=) // 检查该字段的size是否在min和max之间
@URL(protocol=, host, port) // 检查是否是一个有效的URL

使用验证

  1. 新建User.java
package com.gala.validator.entity;

import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

import org.hibernate.validator.constraints.Length;

public class User {

    private Long id;

    @NotEmpty
    @Length(min = 2, max = 10)
    private String name; // 非空校验、长度必须在2~10位之间

    private String password;

    @Min(value = 1)
    private Integer age; // 最小是1岁

    @NotEmpty
    @Email
    private String email; // 非空校验、邮箱格式

    private String address;

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  1. 新建IndexController.java
package com.gala.validator.controller;

import java.util.List;
import java.util.Locale;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.gala.validator.entity.User;

@RestController
public class IndexController {

    @Autowired
    private MessageSource messageSource; // 用于格式化错误消息

    @RequestMapping(value = "/validator")
    public String validator(@Valid User entity, BindingResult result) {
        if (result.hasErrors()) {
            StringBuffer msg = new StringBuffer();
            // 获取错误字段集合
            List<FieldError> fieldErrors = result.getFieldErrors();
            // 获取本地locale,zh_CN
            Locale currentLocale = LocaleContextHolder.getLocale();
            // 遍历错误字段获取错误消息
            for (FieldError fieldError : fieldErrors) {
                // 获取错误信息
                String errorMessage = messageSource.getMessage(fieldError, currentLocale);
                // 添加到错误消息集合内
                msg.append(fieldError.getField() + ":" + errorMessage + " , ");
            }
            return msg.toString();
        }
        return "验证通过," + "名称:" + entity.getName() + "年龄:" + entity.getAge() + "邮箱地址:" + entity.getEmail();
    }
}
  1. 验证
    地址:http://127.0.0.1:8080/validator

地址:http://127.0.0.1:8080/validator?age=0&email=abc

自定义验证

自定义验证需要提供两个文件内容,一个是注解、另外一个是对应注解继承ConstraintValidator的实现类。

我们在User内添加一个字段flag,需要验证flag字段内容仅为1,2,3。

  1. 注解
package com.gala.validator.verification;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Retention(RetentionPolicy.RUNTIME) // 注解将会由虚拟机保留,以便它可以在运行时通过反射读取.
@Target({ ElementType.PARAMETER, ElementType.FIELD })
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator {

    // flag的有效值多个使用','隔开
    String values();

    // 提示内容
    String message() default "flag不存在";

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

    Class<? extends Payload>[] payload() default {};
}
  1. 实现类
package com.gala.validator.verification;

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

public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Object> {
    // 临时变量保存flag值列表
    private String values;

    // 初始化values的值
    @Override
    public void initialize(FlagValidator flagValidator) {
        // 将注解内配置的值赋值给临时变量
        this.values = flagValidator.values();
    }

    // 实现验证
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        // 分割定义的有效值
        String[] value_array = values.split(",");
        boolean isFlag = false;
        // 遍历比对有效值
        for (int i = 0; i < value_array.length; i++) {
            // 存在一致跳出循环,赋值isFlag=true
            if (value_array[i].equals(value)) {
                isFlag = true;
                break;
            }
        }
        // 返回是否存在boolean
        return isFlag;
    }
}
  1. 调整实体类,增加flag字段
package com.gala.validator.entity;

import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

import org.hibernate.validator.constraints.Length;

import com.gala.validator.verification.FlagValidator;

public class User {

    private Long id;

    @NotEmpty
    @Length(min = 2, max = 10)
    private String name; // 非空校验、长度必须在2~10位之间

    private String password;

    @Min(value = 1)
    private Integer age; // 最小是1岁

    @NotEmpty
    @Email
    private String email; // 非空校验、邮箱格式

    private String address;

    @FlagValidator(values = "1,2,3")
    private String flag;

    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 getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }
}
  1. 验证
    地址:http://127.0.0.1:8080/validator?flag=4&name=admin&email=abc@163.com

地址:http://127.0.0.1:8080/validator?flag=1&name=admin&email=abc@163.com

相关文章

网友评论

      本文标题:SpringBoot2 - validator

      本文链接:https://www.haomeiwen.com/subject/qshpyftx.html