0
点赞
收藏
分享

微信扫一扫

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

肉肉七七 2022-03-18 阅读 67

参考: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 条评论