validator-tools

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操作
@Email用来校验传入的数据是否符合邮箱格式的
@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提供的函数列表
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值