Java之validator检验工具类
前言:最近才接触到了Java中的validator,参数检验依赖包,确实让我惊艳到了。臃肿的参数检验代码用几个注解就搞定了,这样在我们的代码中就只剩下业务的代码,真正做到了参数检验和业务代码的分离。
1、validation-api 原生注解。
注:引hibernate-validator依赖即可,这里只是对api原生介绍
@AssertTrue、@AssertFalse | 作用在布尔类型的属性上,校验其值是true或者false |
---|---|
@DecimalMax、@DecimalMin | 支持BigDecimal、BigInteger等类型,限定其最大值和最小值,包含界限值 |
@Min、@Max | 支持int、BigDecimal、BigInteger等类型,限定最大值和最小值,包含界限值 |
@Digit | 作用在数字上,有两个参数,分别是integer和fraction,integer用来限定小数点前的位数,fraction用来限定小数点后的位数 |
@Future | 作用在日期类型上,根据官网的说法是Date和Calendar,要求传入的时间是未来的时间 |
@Past | 此注解和Future是相反的,要求传入的时间是过去的时间 |
@Null | 用来表示当前字段是否为null |
@Size | 作用在Collection集合、Map集合以及CharSequence类型(String是CharSequence子类),注解内有两个参数,分别是min、max,作为长度的上限和下限,包含上下限值 |
@Pattern | 通过正则表达式表达式校验传入参数是否符合要求 |
注意:这里所列出来的是当前版本所提供的校验函数,依赖包是会不断的更新的(只有不断更新的依赖才是活跃的,才更加的强大),所以这里传授的是,学会看依赖中给我们提供了那些函数,函数的上方也会给我们介绍函数的作用。
2、基于Java原生接口实现的工具类hibernate-validator。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.20.Final</version>
</dependency>
注意:我现在使用的是validator是到maven中心仓拿取的使用数最多的版本,当你想要使用的时候,可能这个版本已经不是最优的版本。所以需要去中心仓去获取最优版本。中心仓链接
2.1、hibernate-validator的简单使用之post请求。
2.1.1、创建一个Java bean。
User类
package com.github.machine.control.pojo;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
@Setter
@Getter
@Data
@Valid
public class User {
@Pattern(regexp = "^[a-zA-Z]+$", message = "不合符要求")
private String name;
@Min(value = 12, message = "不能小于12")
private int age;
@Valid
private Detail detail;
}
Detail类
package com.github.machine.control.pojo;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
@Data
@Setter
@Getter
public class Detail {
@Length(min = 2, max = 30, message = "不在区间内....")
private String describe;
private String id;
}
这里有个非常需要注意的点是:private Detail detail; 属性上面必须添加@Valid,否则不会进行Detail的检验。
2.1.2、创建controller层
package com.github.machine.control.eps8826;
import com.github.machine.control.pojo.User;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
@RequestMapping("/demo")
public class EpsController {
@RequestMapping(value = "user", method = RequestMethod.POST)
public String user(@RequestBody @Valid User user, BindingResult bindingResult) {
return bindingResult.hasErrors() ? bindingResult.getFieldError().getDefaultMessage() : "success";
}
}
这里必须要注意的两点
1、一定要添加@Valid 注解,否则不会进行user对象的检验。
2、一个要添加BindingResult,用来接收检验的结果,否则会就包报图二的错误。
图一
图二 (Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: ‘java.lang.String org.springframework.core.log.LogFormatUtils.formatValue(java.lang.Object, int, boolean)’] with root cause)
使用检验成功效果。
body
{
"name": "lisi",
"age": 18,
"detail": {
"describe": "describe",
"id": "id1"
}
}
检验失败效果
body
{
"name": "lisi22",
"age": 18,
"detail": {
"describe": "describe",
"id": "id1"
}
}
2.2、hibernate-validator的简单使用之GET请求。
@GetMapping("/error")
@ResponseBody
public String error(@RequestParam("name") @Size(min = 2, max = 5, message = "名字长度不合法") String name) {
return "success";
}
String类型可以直接在controller层中添加注解。
Hibernate-validator封装注解
@NotBlank | 这个注解其实不是validation包里面的,如果需要用它,需另外引入hibernate-validator包,用来限定属性不能为null和空串,一般都是用在String类型属性上,此注解会将传入的字符串的前面和后面的空清除,相当于执行了trim操作 |
---|---|
@NotEmpty | 限定属性不能为空,需要和@NotBlank注解区分开,两者有所不同,此注解不会执行trim操作 |
用来校验传入的数据是否符合邮箱格式的 | |
@Range | 范围值,包含两个主要的两个属性min和max,这个相当于对validator-api中@Min和@Max的再次封装,将两个注解合并为一个注解,包含边界值 |
3、代码看护,单元测试。
package com.github.machine.control.pojo;
import org.apache.commons.validator.routines.DoubleValidator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.util.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;
import javax.validation.Validator;
import java.util.Set;
public class TestUser {
private static Validator validator;
@BeforeAll
public static void init() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@Test
public void testValidUser() {
User user = new User();
user.setAge(12);
user.setName("dffjj");
Detail detail = new Detail();
detail.setDescribe("j");
detail.setId("id1");
user.setDetail(detail);
// 校验整个user对象属性
final Set<ConstraintViolation<User>> validates = validator.validate(user);
Assertions.assertTrue(CollectionUtils.isEmpty(validates));
}
@Test
public void testValidateProperty() {
User user = new User();
user.setName("dffjj");
// 校验整个user对象属性
final Set<ConstraintViolation<User>> validates = validator.validateProperty(user, "name");
Assertions.assertTrue(CollectionUtils.isEmpty(validates));
}
}
3、commons-validator校验工具类。
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.7</version>
</dependency>
3.1 commons-validator的使用
@Test
public void testCommonsValid() {
boolean b = DoubleValidator.getInstance().minValue(2.0, 1.0);
boolean isEmail = EmailValidator.getInstance().isValid("123456789@qq.com");
}
3.2 commons-validator提供的函数列表