Apache Camel文本文件解组Java对象遇固定长度记录异常
Apache Camel固定长度文本解组问题排查与解决
1. 排查编码与隐藏字符
- 用Notepad++等编辑器开启「显示所有字符」,检查行尾是否有
\r、不可见空格或乱码问号,这些字符会占用长度但未被映射到Java对象字段。 - 确认文件编码(如UTF-8、GBK)与Camel解组时使用的编码一致,避免因编码差异导致字符长度计算错误(比如UTF-8的BOM头会占用3字节)。
2. 校验固定长度配置
- 核对
FixedLengthDataFormat的总长度设置为1288,且所有字段的起始位置+长度之和严格等于1288,不能有遗漏或重复计算:
FixedLengthDataFormat fixedFormat = new FixedLengthDataFormat(); fixedFormat.setLength(1288); // 示例字段配置,需确保所有字段长度总和为1288 fixedFormat.addField("bodyContent", 0, 1288); // 或拆分多个字段:fixedFormat.addField("field1", 0, 50); fixedFormat.addField("field2", 50, 1238);
3. 处理记录分隔符
- 若文件用Windows格式换行符
\r\n,需在配置中明确设置分隔符,避免\r被计入记录长度:
fixedFormat.setDelimiter("\r\n"); // 或开启忽略换行符 fixedFormat.setIgnoreNewLine(true);
4. 验证单条记录的真实长度
- 用代码读取单条记录的字节与字符长度,定位长度差异原因:
String line = Files.readAllLines(Paths.get("your-file.txt")).get(0); // 输出字节长度(需指定文件编码) System.out.println("字节数:" + line.getBytes("UTF-8").length); // 输出字符数 System.out.println("字符数:" + line.length());
如果字节数是1288但字符数是1287,说明存在多字节字符(如中文或乱码问号),需统一编码后再解组。
5. 清理未映射字符
- 若行尾确实存在多余的问号或无效字符,可在解组前过滤:
from("file://input-dir") .transform().body(String.class, s -> s.replaceAll("[^\\x20-\\x7E]$", "")) // 去掉行尾非打印字符 .unmarshal(fixedFormat) .to("bean://yourBusinessProcessor");
内容的提问来源于stack exchange,提问作者bhat
相关产品推荐
相关产品推荐

