SpringBoot2 - validator
2018-06-26 本文已影响0人
朱穆朗玛
构建项目
- 访问地址:http://start.spring.io
- 添加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
使用验证
- 新建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;
}
}
- 新建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();
}
}
地址:http://127.0.0.1:8080/validator?age=0&email=abc
自定义验证
自定义验证需要提供两个文件内容,一个是注解、另外一个是对应注解继承ConstraintValidator的实现类。
我们在User内添加一个字段flag,需要验证flag字段内容仅为1,2,3。
- 注解
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 {};
}
- 实现类
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;
}
}
- 调整实体类,增加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;
}
}
地址:http://127.0.0.1:8080/validator?flag=1&name=admin&email=abc@163.com