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

Apache Camel使用Univocity解组CSV设asMap=true报空指针异常

问题根因

你触发空指针的核心原因是asMap=true配置依赖CSV表头作为Map的Key,当前配置未指定表头来源,解析器无法获取Map的键名,处理行数据时就会抛出空指针。
asMap=false时解析器只需要按顺序输出每行的字段值列表,不需要表头,所以运行正常。

修复方案

方案1:CSV文件自带表头(第一行是字段名)

在UniVocityCsvDataFormat配置中添加setHeaderExtractionEnabled(true),开启自动提取第一行作为表头:

@Override
public void configure() {
    log.info("StartApplication...Camel");
    UniVocityCsvDataFormat dataFormat = new UniVocityCsvDataFormat()
            .setNullValue("N/A")
            .setLazyLoad(true)
            .setAsMap(true)
            // 新增:开启第一行作为表头提取
            .setHeaderExtractionEnabled(true);
    from("file://source/?idempotent=false&delete=false")
            .startupOrder(1)
            .autoStartup(true)
            .routeId("read-csv")
            .log("Filename:${file:name}")
            .unmarshal(dataFormat).split().body()
            .log("${body}");
    log.info("StopApplication...Camel");
}

方案2:CSV文件无表头,自定义指定字段名

如果你的CSV没有表头行,直接用setHeaders方法手动指定表头字段列表:

UniVocityCsvDataFormat dataFormat = new UniVocityCsvDataFormat()
        .setNullValue("N/A")
        .setLazyLoad(true)
        .setAsMap(true)
        // 按字段顺序自定义表头
        .setHeaders(new String[]{"字段1", "字段2", "字段3"});

注意事项

  • 开启setHeaderExtractionEnabled(true)后,解析器会自动跳过第一行的表头内容,不会把表头作为数据行输出
  • 手动指定表头时要确保字段数量和CSV每行的字段数量匹配,避免出现字段错位的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:06:05