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
相关产品推荐
相关产品推荐

