乐趣区

Hibernate-Validator入门及使用

前言

最近在开发某个模块的功能时,里面包含大量对请求参数判空和验证的步骤且参数繁多,存在大量的重复判断,验证影响代码的美观遂决定优化这部分代码。SpringBoot 自带了参数验证框Hibernate Validator,下面是自己的学习笔记。

依赖

若使用 SptingBoot,在 spring-boot-starter-web 包中包含此框架依赖,其他框架加入依赖即可

    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.17.Final</version>
    </dependency>
  • 个人认为官方文档是最好的资料,如有需要请浏览:https://docs.jboss.org/hibern…

使用

新建类User

package com.longhc.uublog;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

@Getter
@Setter
@NoArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = -2164567260938543876L;

    private String userId;
    
    // 字段 userName 不可为 null,且 length>0
    @NotBlank
    private String userName;
    
    // 密码需要匹配正则表达式
    @Pattern(regexp = "^[A-Z]{0,3}[0-9]{5,10}")
    private String password;

    // 验证是否是正确的电子邮件格式
    @Email
    private String email;

    // 家庭住址不为空
    @NotNull
    private String address;

    @Override
    public String toString() {return JSON.toJSONString(this);
    }
}
  • 使用 Validator 校验传入参数是否符合规则
package com.longhc.uublog;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

@Slf4j
public class VaildatorTest {

    @Test
    public void test() {
        // 获得默认的 Validator
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

        Consumer consumer = new Consumer();
        consumer.setUserName("longhaicheng");
        consumer.setAddress(null);
        consumer.setEmail("123456789");
        // 验证 consumer 是否符合要求,并返回 set 集合,若 set 集合 size()返回 >0,说明存在违规的参数,通过日志打印
        Set<ConstraintViolation<Consumer>> constraintViolations = validator.validate(consumer);
        if (constraintViolations.size() > 0) {for (ConstraintViolation<Consumer> constraintViolation : constraintViolations) {String message = constraintViolation.getMessage();
                log.error("message:{}", message);
            }
        }
    }
}
  • 日志返回:

  • 参数校验失败返回错误消息,也可以定制错误消息,通过注解中的 message 属性配置
@NotBlank(message = "字段 [userName] 不可为空")
@Pattern(regexp = "^[A-Z]{0,3}[0-9]{5,10}",message = "字段 

  此处含有隐藏内容,需要正确输入密码后可见!

需匹配表达式[{regexp}]") @Email(message = "错误的电子邮箱格式") @NotNull(message = "家庭住址不为空")
  • 要在 Spring 中使用此框架
package com.longhc.uublog;

import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;



@Component
@Slf4j
public class ValidatorUtil {public static Validator getValidator() {
        // 使用 HibernateValidator
        Validator validator = Validation.byProvider(HibernateValidator.class)
                .configure()
                // 快速失败(即:第一个参数校验失败就返回错误信息,而不是校验所有的参数,并一次性返回所有的错误信息).failFast(true)
                .buildValidatorFactory()
                .getValidator();
        return validator;
    }

    /**
     * @param object object
     * @param groups groups
     */
    public void validateObject(Object object, Class<?>... groups) {Set<ConstraintViolation<Object>> constraintViolations = getValidator().validate(object, groups);
        if (constraintViolations.size() > 0) {for (ConstraintViolation<Object> constraintViolation : constraintViolations) {String message = constraintViolation.getMessage();
                log.error("errorMessage:{}", message);
            }
        }
    }
}
退出移动版