部署新版平台生成的元数据到旧版客户环境时,因元数据和代码不匹配导致报错。5.0.011及以后版本可兼容新标签,但旧版本需手动修复。建议基于目标平台生成元数据,并关注元数据兼容性。类比Java JDK版本不兼容问题,强调平台只能新版本兼容旧标签。
问题描述:部署元数据到客户环境,使用删除分录功能报错,如图。
问题原因:
先说结论:新版平台生成的元数据,部署到使用旧版平台的客户环境。元数据和代码不匹配,元数据新而代码旧,旧平台无法识别上述新标签而报错。
已做兼容:
1. 5.0.011(需打紧急补丁)及以后的版本,DeleteEntryParameter是可以兼容的,出现此标签不会报错且功能正常;
2. 此标签在5.0.012 - 5.0.017开发平台会生成,后续版本已废弃不再生成;元数据标签DeleteEntryParameter与EntryOpParameter可以互相替换;
3. 但因为存量元数据并无法干预,并不会自动修复上述问题。且必须部署到5.0.011之前的版本,需要按照以下方法来修复:
解决方法:
此问题可以简单在线修复,如图修改图中元数据DeleteEntryParameter为EntryOpParameter就可以了
大范围修复方法:通过数据库检查元数据表是否使用此新标签,确定范围批批量修改元数据
建议:
1. 尽量基于目标平台版本去生成元数据,不能匹配一定要进行检查,元数据兼容问题一般易发现;
2. 出包前对比目标平台元数据,应只保留自己需修改部分,不要带无关内容出去。
扩展延伸:
关于这个问题我需要解释一番,首先看一个例子:
作为 Java 开发者,大家是否曾经遇到过这样的问题:精心编写的 Java 程序却因为 JDK 版本不兼容而无法运行,弹出 "class file version 61.0, this version of the Java Runtime class file 52.0" 这样的错误提示?
这个问题的根源在于 JDK 版本不兼容。当使用较高版本的 JDK(如 JDK 17)编译 Java 程序时,生成的字节码针对该特定版本进行了优化。但是,如果你尝试使用较低版本的 JDK(如 JDK 1.8)运行已编译的程序,就会出现兼容性问题。较低版本的 JDK 无法识别较高版本 JDK 生成的字节码指令,从而导致 "class file version 61.0, this version of the Java Runtime class file 52.0" 错误。
不巧的是元数据没有这种版本兼容机制,它允许你导出的元数据可以导入到不同版本的平台使用。试想拿着5.0的元数据导入到1.0的苍穹会发生什么?这个问题一直存在,遇到的这个问题只是其中一例。
我们不苛求元数据要有版本控制机制,也不苛求开发者一定要基于目标平台导出元数据(我深知不同苍穹版本环境的复杂性,想要建立不同版本的运行环境难于登天)。只希望大家能理性看代这个问题,将心比心,平台开发者不能未卜先知,平台只能做到新版本兼容旧标签,而做不到让旧版本兼容新标签。
再出私包补丁时不止考虑插件代码的兼容性问题,元数据的兼容性问题同样需要关注。