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

