今天在线上发现一笔异常数据,根据代码定位是两个String 值equals 不等(但是从数据库的值来看两者是完全相等的,都为 "AA ")或其他条件不对,但是前者的可能性最大。由于一直定位不了具体问题,只能把线上数据拉出来,导入线下进行debug。debug后才发现一个值是"AA ",一个值是"AA",也就是有个进行了trim,有个没有trim。通过代码一路跟进,没有发现任何地方进行了trim操作。这次改动和以前唯一的不同就是前者(没有trim)是从DB中读取的,后者(有trim)是由DB读取改为了远程调用。难道远程调用出现了trim?通过debug发现果真如此,trim的操作发生在了xfire的反序列化操作上,代码片段如下:
看到这儿已经很明确了,就是在涉及到远程服务的序列化和反序列化时候,对参数都会进行trim操作。解决上述问题,要么是对基础jar进行更换,不让其trim,要么是对数据进行订正,把前者进行trim掉,还有一个挫办法就是在查询的地方吧前者进行trim,我们选择了数据订正。
在SOA的架构中,会有大量的子系统共同协助完成一个业务。数据结构都是统一存储,使用分散在各个点,与其在使用处进行处理还不如在入口进行处理,保证数据是有效且完整的。
还有一个重要原因就是做web应用,对用户提交的数据进行trim处理应该是个基础动作,试想下用户会使用空格来做区分么,或者说下次用户登录的时候会记得之前输入了几次空格?所以应该在入口处就做好这个基准动作。反过头来对于核心应用,也不应该依赖底层框架的默认处理,在入口处也应该要做参数的基本处理。
在回顾我们的问题,再深究一下,在数据统一收集到核心系统后,外面对于这类数据如果真的需要保存这些数据,也应该是和核心数据比对成功后才能存储,保证存储数据的一致性。