Spring Hibernate Validator 服务层的入参校验

博客指出网上Hibernate Validator多应用于控制层,在后台控制层参数校验因前端插件封装而鸡肋。项目现有入参校验用反射机制,存在实体类参数名改变需改业务层方法、对boolean类型参数校验被动等问题。强调使用其分组功能在服务层入参校验更灵活,还提及入参校验工具类和测试类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Hibernate Validator 进行入参校验,在网上搜了一大堆都是应用在控制层,由于前端插件的高度封装,在后台控制层进行参数校验已经很鸡肋。

项目中已有的入参校验是利用反射机制,对指定参数(硬编码参数名)进行逻辑校验,如果实体类参数名改变那么相应的业务层方法也要改动;另外对boolean类型的参数利用反射机制进行校验显得也很被动(isField(),不是getField())。

业务中通常情景很多,使用Hibernate Validator 的分组功能在服务层的入参校验还是比较灵活的。

1.入参校验工具类:

package com.xxx.xxx.cod.util;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.StringUtil;
import org.apache.shiro.util.CollectionUtils;
import org.hibernate.validator.HibernateValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

/**
 * 入参校验工具类
 */

public class ParamValidateUtil {
    private static final Logger logger = LoggerFactory.getLogger(ParamValidateUtil.class);
    /**
     * 使用hibernate的注解来进行验证
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class).
            configure().failFast(false).buildValidatorFactory().getValidator();
            //failFast(true)遇到一个错误信息便返回;failFast(false)校验完所有参数后才返回

    /**
     * 不需要校验有分组的参数时,只需传入obj
     * 如果要校验指定分组的参数时,需要传入obj和var(分组interface)
     */
    public static <T> JSONObject validate(T obj,Class...var) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj,var);
        JSONObject jsonObject = new JSONObject();
        StringBuilder errorSB = new StringBuilder("");
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            for (ConstraintViolation<T> cv : constraintViolations) {
                errorSB.append(cv.getMessage());
            }
            logger.error(errorSB.toString());
        }
        if (StringUtil.isNotEmpty(errorSB.toString())) {
            jsonObject.put("code", 1);
            jsonObject.put("message", errorSB.toString());
        } else {
            jsonObject.put("code", 0);
        }
        return jsonObject;
    }

}

2.测试类:

public static void main(String[] args) {
    ParamVO paramVO = new ParamVO();
    paramVO.setUserName("admin");
    paramVO.setAge(null);
    paramVO.setStudentNo("123");
    paramVO.setQuantity(1);
    paramVO.setWeight(100);
    //校验没有分组的参数
    JSONObject jsonObject = ParamValidateUtil.validate(paramVO);
    //只校验指定分组的参数(这里不贴实体类了,PassFlagCheck是ParamVO类的内部接口,用于分组)
    //JSONObject jsonObject = ParamValidateUtil.validate(paramVO, ParamVO.PassFlagCheck.class);
    System.out.println("jsonObject = " + jsonObject);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值