Hibernate-validate工具类,手动调用校验返回结果

Posted duguxiaobiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate-validate工具类,手动调用校验返回结果相关的知识,希望对你有一定的参考价值。

  引言:在常见的工程中,一般是在Controller中校验入参,校验入参的方式有多种,这里介绍的使用hibernate-validate来验证,其中分为手动和自动校验,自动校验可以联合spring,使用@Valid注解,以及 BindingResult类来自动收集消息,这里介绍的如何自动的,随时随地的调用工具类,校验指定类或注定属性是否符合规则,将错误封装。

 

1. 添加 hibernate-validate依赖

  

<!--hibernate validate-->
<dependency>
    <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
    <version>6.0.16.Final</version>
</dependency>

 

2. 接收处理结果,以及输出格式化的一个实体类

package com.stylefeng.guns.core.util;

import org.apache.commons.lang3.StringUtils;

import java.text.MessageFormat;
import java.util.Map;

/**
 * @author ztkj-hzb
 * @Date 2019/8/28 11:26
 * @Description 实体校验结果
 */
public class ValidationResult 

    /**
     * 是否有异常
     */
    private boolean hasErrors;

    /**
     * 异常消息记录
     */
    private Map<String, String> errorMsg;

    /**
     * 获取异常消息组装
     *
     * @return
     */
    public String getMessage() 
        if (errorMsg == null || errorMsg.isEmpty()) 
            return StringUtils.EMPTY;
        
        StringBuilder message = new StringBuilder();
        errorMsg.forEach((key, value) -> 
            message.append(MessageFormat.format("0:1 \r\n", key, value));
        );
        return message.toString();
    


    public boolean isHasErrors() 
        return hasErrors;
    

    public void setHasErrors(boolean hasErrors) 
        this.hasErrors = hasErrors;
    

    public Map<String, String> getErrorMsg() 
        return errorMsg;
    

    public void setErrorMsg(Map<String, String> errorMsg) 
        this.errorMsg = errorMsg;
    

    @Override
    public String toString() 
        return "ValidationResult" +
                "hasErrors=" + hasErrors +
                ", errorMsg=" + errorMsg +
                ‘‘;
    

 

  

3. 创建工具类,提供公共方法校验,返回结果

package com.stylefeng.guns.core.util;


import org.apache.commons.collections.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author ztkj-hzb
 * @Date 2019/8/28 11:21
 * @Description 实体校验工具类
 */
public class ValidateUtil 

    private ValidateUtil() 
    

    /**
     * 验证器
     */
    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();


    /**
     * 校验实体,返回实体所有属性的校验结果
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> ValidationResult validateEntity(T obj) 
        //解析校验结果
        Set<ConstraintViolation<T>> validateSet = validator.validate(obj, Default.class);
        return buildValidationResult(validateSet);
    

    /**
     * 校验指定实体的指定属性是否存在异常
     *
     * @param obj
     * @param propertyName
     * @param <T>
     * @return
     */
    public static <T> ValidationResult validateProperty(T obj, String propertyName) 
        Set<ConstraintViolation<T>> validateSet = validator.validateProperty(obj, propertyName, Default.class);
        return buildValidationResult(validateSet);
    

    /**
     * 将异常结果封装返回
     *
     * @param validateSet
     * @param <T>
     * @return
     */
    private static <T> ValidationResult buildValidationResult(Set<ConstraintViolation<T>> validateSet) 
        ValidationResult validationResult = new ValidationResult();
        if (CollectionUtils.isNotEmpty(validateSet)) 
            validationResult.setHasErrors(true);
            Map<String, String> errorMsgMap = new HashMap<>();
            for (ConstraintViolation<T> constraintViolation : validateSet) 
                errorMsgMap.put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage());
            
            validationResult.setErrorMsg(errorMsgMap);
        
        return validationResult;
    

 

以上是关于Hibernate-validate工具类,手动调用校验返回结果的主要内容,如果未能解决你的问题,请参考以下文章

驱动编程调优相关辅助工具-图形图像类

自定义异常将工具类的错误抛给调用者servlet,将原本的控制界面跳转工作交还给servlet

solaris 11.2怎么调分辨率

Gson手动序列化POJO(工具类)

java 啥资源需要手动释放

开发实用小工具-通过类自动创建数据库表,从此摆脱手动建表麻烦