在做java项目时,参数转化实体、实体间互相转换这是不可避免的操作。但是在转换的时候却经常遇到莫名其妙的问题。现在将近期遇到的实体转换的问题记录一下。
第一次是在系统某模块升级后,在实体定义中增加了一个字段,刚好该实体被之前的一个方法引用。在该引用中,将这个实体对象json实例化后,以参数形式提交到另一个系统的远程接口。而远程接口未做任何改动。这是一个比较隐蔽的bug,因为之前这个功能是正常的,而且codeReview时修改的地方未涉及这个功能,也就没有细看。系统上线后,运营同事说功能有问题,之前正常的接口调用那块现在一直不通。检查代码,系统也请求接口了,返回结果一直是异常,但是远程接口调用却没有任何日志输出,可以确定是在进入接口方法前就出现了错误。
检查远程接口代码,接口参数接收定义成了一个具体的实体类,而这个实体类与升级模块实体类定义不在一个地方,导致升级模块的实体字段多于接口实体,在接口接收至参数进行实体类转换时,多出来的字段因为实体未定义面导致整个实体类转换失败,从而导致整个接口异常。将两个实例定义统一后系统正常。
第二次是在系统内部因为业务需要,实体类增加了字段,相应的方法都做了修改。但是由于此处是公共模块,有一个系统未做修改,因此在发版时没有处理。但该系统引用了此公共模块,而且它的jar包是旧的,在系统运行时,使用com.fasterxml.jackson.databind.ObjectMapper.convertValue()方法进行实体类转换,系统抛出异常。
经检查,是由于转换参数和实体类字段不匹配,转换参数字段多于实体类字段,因此导致失败。更新异常系统的jar包后,系统运行正常。
对于上述两种情况,都是由于参数与实体转换时字段定义数量或类型不一致导致,在此做一次记录。
对上面的情况总结如下:
1、定义接口时为了避免出现类似兼容问题,尽量用request读取参数方式获取传参。如果参数比较多,调用方和参数传递方尽可能用同一jar包的实体,不要各自定义。
2、com.fasterxml.jackson.databind.ObjectMapper.convertValue()方法在实体转换时存在一些不足,建议在一些公用模块中涉及实体转换的改用BeanMapper