入参等数据校验的思考

在进行真正的业务操作之前,为了确定数据都是合法可靠地,需要对数据进行检查。数据一般有以下几个来源

  • 外部调用
    – 前端
    – 第三方服务
    – 另一个可信服务
  • 数据库

显而易见,数据的校验越早越好,这样后面被调用的方法就不用再校验。如此看来public方法一般需要校验而private方法可以不校验。为了方便阅读,private还是可以加上annotation。

外部调用

对于外部调用时的检查又可以分为两种

外部数据本身的检查

  • controller
    这个应该在controller来做掉,并且有的时候存在方法合并的问题。就是一个调用可能指向后端的两个方法。并且这个时候如果不能完美的将这个调用分为两个方法的话,使用校验框架也会比较麻烦,应为数据间存在依赖。
    如果把对可信服务的接口单独出来的话,可以减少一些调用。但是这样的问题就是面临了解对方的业务。并且把接口分为内部调用和外部调用觉得有些不够优雅,不够厉害。
  • validate
    就是使用校验框架来处理,最好是隐含着通过Filter或者AOP来处理,这里面又可以分为两种
    – interface 需要dto实现validate接口,然后AOP只负责调用即可。好处是灵活
    – annotation 在字段上加上限制条件,然后AOP根据这些条件去处理。 好处是中文意思比较一致(可以根据annotation上来)

结合本地数据检查

这个应该在domain来做,应为这个多少算是业务逻辑相关。比较麻烦的也是一个外部调用对应两个domain方法的问题,这是domain的入参未必一致,可能存在转化的需要。另一个需要做转化的原因是DTO和parameter的差别还在于是否有Session的数据。

数据库

数据修复

这样处理符合上面提到的最早校验的原则。比较麻烦的是默认值的处理,就是后面新增的字段,特别是这个字段可能不是一个column而是json里的一个字段。这里涉及到新增字段是统一update来修改原有数据还是保留。

统一update

这个做法的问题是将业务逻辑从domain移动到了sql。如果都是同一个值还好多,如果有判断与计算则sql会比较麻烦。

由domain来重新处理

这样做的话就要将数据库的所有数据都过一遍。感觉动作比较大。这样做的另一个问题(或者是好处)是发消息通知其他系统做更改。

延迟处理

就是加了新的字段时并不改动数据库,而是在做业务时读出来再处理。这样的话系统更新会比较快,安全。缺点是不断积累可能为空的字段需要加上默认值处理。另外一个问题是查询的时候默认值处理再一次到了sql那里。

结论

尽可能避免一个controller根据if来调用两个domain方法的情况。通过url或者面向对象来处理成无差别。
service可以不处理入参但是service调用的domain还是要处理
新增字段的处理要及早处理,通过建新表来避免最好。如果是新增的计算得到的字段如何处理还没想清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值