现实场景中的自定义校验

最近这段时间业务提了很多关于字段校验的需求,当然严格的字段校验能保持数据的完整性。
首先就是非空校验,项目用的springBoot 2.0版本其中的非空验证用的是 @Valid标签,
其中代码部分如下实现
 

@RequestMapping(value = "/Done", method = {RequestMethod.GET,RequestMethod.POST})
    public String Done(@RequestBody @Valid VerificationEntity request, BindingResult result) {
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            StringBuilder stringBuilder = new StringBuilder();
            for (ObjectError error : errors) {
                stringBuilder.append(error.getDefaultMessage()).append("|");
            }
            return "false";
        }
        return "";
  }


@Data
public class VerificationEntity implements Serializable {

    private static final long serialVersionUID = -1672680939195600441L;

    @Valid
    @NotBlank(message = "姓名不能为空")
    public String name;

    @Valid
    @NotBlank(message = "年龄不能为空")
    public String age;

    public String sex;
}

然后就是一些自定义的校验规则,因为规则众多之举几个简单的例子,

首先是划分是哪个接口业务拦截,下单接口、退费接口、投诉接口等规则逻辑,这是最外层的校验拦截,为什么不讲校验用AOP拦截呢,写进AOP的话,所有的接口都会校验,但是现实情况,不至于这么广泛的校验。

代码结构

public interface ComplainVerificationService<T> {

    /**
     * 投诉接口业务逻辑校验
     * @param agencyCode
     * @param t
     * @return
     */
    VerificationResult complainValid(String agencyCode, T t);
}


public interface DoneVerificationService <T> {

    /**
     * 成交接口业务规则校验
     * @param agencyCode
     * @param t
     * @return
     */
    VerificationResult doneValid(String agencyCode, T t);
}

public interface RefundVerificationService<T> {

    /**
     * 退费业务校验
     * @param agencyCode
     * @param t
     * @return
     */
    VerificationResult refundValid(String agencyCode, T t);
}

2.然后就是业务层级别的数据校验,例如 下单接口和退费接口公用的人员年龄校验,退费接口和投诉接口公用的人员职业校验,下单和投诉接口的人员性别校验。当然这些都是一些简单的例子,整体的校验思想是类似的,首先是自定义的接口类分类,每个业务级别的校验都是独立的接口,如上述所说的 年龄校验、职业校验、以及性别校验,为了保持自定义校验的统一性和复用性,每一个接口都是特定的入参和返回值,这样可以最大程度的统一化。
 

public interface ageVerificationService {

    boolean validAge(ageDto ageDto);
}


@Log4j
@Service
public class ageVerificationServiceImp implements ageVerificationService {

    @Override
    public boolean validAge(ageDto ageDto) {
        /**
         * todo 这里做最主要的业务检验
         */
        return false;
    }
}

当然自定义接口的分类,必须按照具体的业务逻辑设计,如电商系统的话,最好是产品校验、流程校验、收费校验等等这种维度,划分原则就是业务上最容易变化的点作为原子。
然后就是渠道自定义的代码实现,为了简明扼要,用其中两个渠道进行校验规则的举例。

@Service
public class ChannelA implements DoneService,ComplainService,ComplainVerificationService {

    @Resource
    private ageVerificationService ageVerification;

    @Resource
    private jobVerificationService jobVerification;

    @Override
    public void done(String params) {
        //todo 实现成交
    }

    @Override
    public void complain(String params) {
        //todo 实现投诉
    }

    @Override
    public VerificationResult complainValid(String agencyCode, Object o) {
        /**
         * 渠道A进行成交业务校验
         * 1.校验年龄
         * 2.校验职业
         */
       boolean ageBoo= ageVerification.validAge(new ageDto());
       boolean jobBoo=jobVerification.validJob(new jobDto());
       return null;
    }
}

@Service
public class ChannelB implements DoneService,RefundService,ComplainVerificationService {

    @Resource
    private jobVerificationService jobVerification;

    @Resource
    private sexVerificationService sexVerification;

    @Override
    public void refund(String params) {
        //todo 实现退费
    }

    @Override
    public void done(String params) {
        //todo 实现成交
    }

    @Override
    public VerificationResult complainValid(String agencyCode, Object o) {
        /**
         * 渠道A进行成交业务校验
         * 1.职业校验
         * 2.性别校验
         */
        boolean ageBoo= sexVerification.validSex(new sexDto());
        boolean jobBoo=jobVerification.validJob(new jobDto());
        return null;
    }
}


总结:这种校验思想,主要分为三层。
一层是对外接口类层面,主要是为第三方提供的接口进行业务层次的划分。
二层是固定的单位实体,主要是第三方固定的渠道级别。
三层就是容易变化的业务规则,这层就是上述提到的最小的单位原子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值