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

