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

如何让Apache Camel BindyCsvDataFormat忽略空白行?

问题描述

我有一个末尾包含若干空白行的CSV文件,希望使用BindyCsvDataFormat将每一行非空白行反序列化为Java对象,代码实现如下:

//within my RouteBuilder class
from("{{route.from}}")
.unmarshal(new BindyCsvDataFormat(MyClass.class));

@CsvRecord(separator = ",", skipField = true, skipFirstLine = true, generateHeaderColumns = true, allowEmptyStream = true)
@Data
public class MyClass {

    @DataField(pos = 1, required = true)
    @NotEmpty
    private String myString;
    
    @DataField(pos = 2, required = true, pattern = "M/d/yyyy")
    @NotNull
    private LocalDate myDate;

    @DataField(pos = 3, required = false, pattern = "M/d/yyyy")
    private LocalDate notRequiredDate;
}

当Camel尝试反序列化仅包含回车换行的空白行时,抛出如下异常:

java.lang.IllegalArgumentException: The mandatory field defined at the position 1 is empty for the line: 5

请问如何配置Apache Camel使其忽略空白行?

解决方法

方式一:启用Bindy内置的空白行忽略配置

BindyCsvDataFormat原生支持跳过空白行,只需在创建实例时调用setSkipEmptyLines(true)开启该配置即可:

from("{{route.from}}")
.unmarshal(new BindyCsvDataFormat(MyClass.class).setSkipEmptyLines(true));

该配置会自动识别并跳过仅含空白字符(换行、空格、制表符等)的行,不会对这类行执行反序列化操作。

方式二:自定义预处理过滤空白行

如果需要更灵活的空白行判断规则(比如过滤包含特定空白格式的行),可以在反序列化前添加一个处理器提前过滤:

from("{{route.from}}")
    .process(exchange -> {
        String csvContent = exchange.getIn().getBody(String.class);
        // 过滤掉所有trim后为空的行
        String filteredContent = Arrays.stream(csvContent.split("\\r?\\n"))
                .filter(line -> !line.trim().isEmpty())
                .collect(Collectors.joining("\n"));
        exchange.getIn().setBody(filteredContent);
    })
    .unmarshal(new BindyCsvDataFormat(MyClass.class));

这种方式可以根据业务需求自定义过滤逻辑,适配更复杂的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:17:57