RPC调用时使用 @Validated进行参数校验

参考:https://www.imgeek.org/article/825359442

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-validation</artifactId>

</dependency>

校验注解

import org.springframework.validation.annotation.Validated;


@Validated

public @interface RPCValidated {

}

使用AOP来进行参数解析校验

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
import org.springframework.stereotype.Component;

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


@Aspect
@Component
@Slf4j
public class RpcValidatedAspect {

    private static Validator validator;

    static {
        validator = Validation.byDefaultProvider().configure()
                .messageInterpolator(new ResourceBundleMessageInterpolator(
                        new PlatformResourceBundleLocator("validationMessages")))
                .buildValidatorFactory().getValidator();
    }

    @Pointcut("@within(com.yangsan.RpcValidated)")
    protected void pointcut() {

    }

    @Around("pointcut()")
    public Object advice(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 执行方法参数的校验
        Set<ConstraintViolation<Object>> constraintViolations = validator.forExecutables().validateParameters(joinPoint.getThis(), signature.getMethod(), args);
        List<String> messages = new ArrayList<>();
        for (ConstraintViolation<Object> error : constraintViolations) {
            messages.add(MessageFormat.format("[value : {0}, message : {1}]", error.getInvalidValue() ,error.getMessage()));
        }
        if (!messages.isEmpty()) {
            return RespUtils.build("参数校验失败", String.join(",", messages));
        }
        return joinPoint.proceed(args);
    }
}

使用方法:1. 在接口实现类增加@RpcValidated注解

@Override

@RPCValidated

public Response create(MessageSmsRechargeDto dto) {

    //todo:业务逻辑......

}

2. 在接口方法中增加@Valid注解

Response create(@Valid MessageSmsRechargeDto params);

3. 实体类定义

@Data

public class MessageSmsRechargeDto implements Serializable {



    /**

     * 充值公司

     */

    @NotNull(message = "充值公司不能为空 ")

    private Long companyId;


    /**

     * 充值备注

     */

    @NotEmpty(message = "充值备注不能为空 ")

    private String rechargeRemark;

 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值