使用Smooks解析MSCONS文件触发BeanInstanceCreator异常求助
使用Milyn Smooks解析MSCONS EDIFACT时遇到VerifyError问题排查
问题概述
使用Milyn Smooks解析匿名化的MSCONS格式EDIFACT文件时,调用D04BInterchangeFactory.fromUNEdifact()方法触发org.milyn.SmooksException,根因为java.lang.VerifyError,提示ASMAccessorImpl类的getKnownEgressType()方法常量池存在非法类型。移除文件中某一条数据集后解析可正常运行,但此前成功处理过更大体积的同类文件,目前无法定位具体原因。
相关信息
核心调用代码
// 解析EDIFACT文件的核心代码片段 String edifactContent = // 读取MSCONS格式EDIFACT文件内容 D04BInterchange interchange = D04BInterchangeFactory.fromUNEdifact(edifactContent);
完整异常栈信息
org.milyn.SmooksException: Failed to filter source. at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:97) at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:64) at org.milyn.Smooks._filter(Smooks.java:526) at org.milyn.Smooks.filterSource(Smooks.java:482) at org.milyn.edi.unedifact.d04b.D04BInterchangeFactory.fromUNEdifact(D04BInterchangeFactory.java:75) // 业务代码调用栈省略 Caused by: java.lang.VerifyError: Bad type on operand stack Exception Details: Location: org/milyn/javabean/accessors/ASMAccessorImpl.getKnownEgressType()Ljava/lang/Class; @3: invokevirtual Reason: Type 'org/milyn/javabean/context/BeanContext' (current frame, stack[0]) is not assignable to 'org/milyn/javabean/context/BeanContext' Current Frame: bci: @3 flags: { } locals: { 'org/milyn/javabean/accessors/ASMAccessorImpl' } stack: { 'org/milyn/javabean/context/BeanContext' } Bytecode: 0x0000000: 2a2b b600 0cb0 Stackmap Table: same_frame(@10) // 其他异常细节省略
项目Maven依赖配置
<dependencies> <!-- Milyn Smooks核心依赖 --> <dependency> <groupId>org.milyn</groupId> <artifactId>milyn-smooks-all</artifactId> <version>1.7.1</version> </dependency> <!-- UN/EDIFACT D04B版本解析依赖 --> <dependency> <groupId>org.milyn.edi.unedifact</groupId> <artifactId>d04b</artifactId> <version>1.7.1</version> </dependency> </dependencies>
问题文件特征
- 遵循MSCONS(D04B版本)EDIFACT规范
- 移除某单条数据集后解析恢复正常
- 文件体积小于此前成功处理的同类文件
排查与解决建议
排查类加载冲突
VerifyError多数因同一类被不同类加载器加载导致类型不匹配。用mvn dependency:tree生成依赖树,检查是否存在重复引入的org.milyn相关jar包,确保所有Milyn组件版本完全一致。验证问题数据集的合法性
提取报错时移除的那条数据集单独解析,复现错误后用EDIFACT规范校验工具检查该数据是否存在字段超长、编码非法、结构不符合D04B规范的情况——这类异常数据可能触发Smooks动态字节码生成逻辑的bug。调整JVM与Smooks字节码生成配置
- 临时添加JVM参数
-noverify(Java 8及以下)或--illegal-access=permit(Java 9+)绕过字节码验证,确认是否为JVM版本兼容性问题。 - 检查项目中的smooks-config.xml配置,确认Bean映射规则是否存在类型定义错误。
- 临时添加JVM参数
升级依赖版本
当前使用的1.7.1版本可能存在已知的字节码生成bug,尝试升级到Milyn最新稳定版(如1.7.5),同时同步升级d04b依赖版本,查看官方issue是否有相关修复记录。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

