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

Apache Camel中配置CsvDataFormat自定义分隔符不生效问题求助

Apache Camel中配置CsvDataFormat自定义分隔符不生效问题求助

看起来你遇到的问题是明明已经给CsvDataFormat设置了自定义的分号分隔符,但序列化的时候还是用了默认配置对吧?我仔细看了你的代码,发现问题出在marshal的调用方式上!

你看你创建了自定义的CsvDataFormat实例:

CsvDataFormat csv = new CsvDataFormat();
csv.setDelimiter(getCsvParameterDelimiter().charAt(0));

但后面marshal的时候用的是.marshal().csv()——这个调用其实是创建了一个新的默认配置的CsvDataFormat实例,完全没用到你之前配置好的那个csv对象!这就是为什么你的自定义分隔符不生效的核心原因。

你只需要把marshal的代码改成用你自己配置好的实例就行,修改后的完整代码片段如下:

CsvDataFormat csv = new CsvDataFormat();
csv.setDelimiter(getCsvParameterDelimiter().charAt(0));
from("direct:generateCsv")
        .process(exchange -> {
            List<LossEvent> lossEventList=   Optional.ofNullable(bean.getLossEventEList()).orElse(Collections.emptyList());
            List<String[]> csvData = new ArrayList<>();
            csvData.add(getHeaders());
            csvData.addAll(convertLossEventsToCsvRows(lossEventList));
            exchange.setProperty("csvData", csvData);
            exchange.getIn().setBody(csvData);
        })
        // 这里改成传入你自定义配置好的csv实例
        .marshal(csv)
        .setHeader("Content-Type", constant("text/csv; charset=UTF-8"))
        .setHeader("Content-Disposition", constant("attachment; filename=Loss_Events.csv"))
        .to("stream:out");

另外再给你提个小建议:可以给分隔符的获取逻辑加个空值判断,避免getCsvParameterDelimiter()返回空字符串的时候调用charAt(0)抛出异常,比如:

String delimiterStr = getCsvParameterDelimiter();
if (delimiterStr == null || delimiterStr.isEmpty()) {
    // 这里可以设置一个默认分隔符,比如逗号
    csv.setDelimiter(',');
} else {
    csv.setDelimiter(delimiterStr.charAt(0));
}

这样就能确保你的自定义分隔符正常生效啦!

备注:内容来源于stack exchange,提问作者user28803304

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:59:31