快捷搜索: 王者荣耀 脱发

Dubbo RPC 调用参数校验 - hibernate validator

普通web请求可以通过 javax.validation.constraints package下的注解进行参数校验,校验的结果会被Spring Mvc包装处理返回到前端,那么rpc调用如何通过注解进行参数校验呢?

查找资料发现可以通过 hibernate validator 进行参数校验,对校验结果进行自定义处理展示。

导入pom依赖

<!-- hibernate validator -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

provider 提供的facade接口

/**
 * 更新库存
 *
 * @param businessStockMessageDTO businessStockMessageDTO
 * @return RpcBaseResponse
 */
RpcBaseResponse<String> updateStock(BusinessStockMessageDTO businessStockMessageDTO);

对 provider 的参数进行注解校验(注解同样是javax.validation.constraints包下的)

在facade接口实现进行参数校验

@Override
public RpcBaseResponse<String> updateStock(BusinessStockMessageDTO businessStockMessageDTO) {
    log.info("[BusinessStockMessageBizServiceImpl.updateStock] businessStockMessageDTO:{}", JSON.toJSONString(businessStockMessageDTO));

    String validate = ValidationUtils.validate(businessStockMessageDTO);
    if (StringUtils.isNotBlank(validate)) {
        // 有参数校验错误
        return RpcBaseResponse.fail(RpcResponseEnum.INVALID_PARAMETER_VALUE, validate);
    }

    // TODO: ...
}

校验工具类[ValidationUtils]的实现

package com.oyo.inventory.common.utils;


import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.HibernateValidator;

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

/**
 * @author kermit.liu on 2018/3/15
 */
public class ValidationUtils {
    /**
     * 使用hibernate的注解来进行验证
     */
    private static Validator validator = Validation.byProvider(HibernateValidator.class)
            .configure().failFast(true).buildValidatorFactory().getValidator();

    /**
     * 功能描述: <br>
     * 〈注解验证参数〉
     *
     * @param obj obj
     */
    public static <T> String validate(T obj) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);
        // 检验不合格处理
        if (CollectionUtils.isNotEmpty(constraintViolations)) {
            List<String> tipList = Lists.newArrayList();
            constraintViolations.forEach(constraintViolationImpl -> tipList.add(constraintViolationImpl.getMessage()));
            return StringUtils.join(tipList, ",");
        } else {
            return "";
        }

    }
}

结果

consumer 调用接口传入的参数若不满足参数要求,上面工具类会返回参数校验注解中的 message 信息。

经验分享 程序员 微信小程序 职场和发展