You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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规范
  • 移除某单条数据集后解析恢复正常
  • 文件体积小于此前成功处理的同类文件

排查与解决建议

  1. 排查类加载冲突
    VerifyError多数因同一类被不同类加载器加载导致类型不匹配。用mvn dependency:tree生成依赖树,检查是否存在重复引入的org.milyn相关jar包,确保所有Milyn组件版本完全一致。

  2. 验证问题数据集的合法性
    提取报错时移除的那条数据集单独解析,复现错误后用EDIFACT规范校验工具检查该数据是否存在字段超长、编码非法、结构不符合D04B规范的情况——这类异常数据可能触发Smooks动态字节码生成逻辑的bug。

  3. 调整JVM与Smooks字节码生成配置

    • 临时添加JVM参数-noverify(Java 8及以下)或--illegal-access=permit(Java 9+)绕过字节码验证,确认是否为JVM版本兼容性问题。
    • 检查项目中的smooks-config.xml配置,确认Bean映射规则是否存在类型定义错误。
  4. 升级依赖版本
    当前使用的1.7.1版本可能存在已知的字节码生成bug,尝试升级到Milyn最新稳定版(如1.7.5),同时同步升级d04b依赖版本,查看官方issue是否有相关修复记录。

内容的提问来源于stack exchange,提问作者Markus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:05:53