Apache Camel Bindy: неожиданные / не нанесенные на карту символы, найденные в конце записи фиксированной длины в строке: 2 - PullRequest
0 голосов
/ 13 февраля 2020

Получение следующего исключения в Camel:

Exchange[
    Id                  ID-Dell-PC-51429-1581618665098-0-4
    ExchangePattern     InOnly
    Headers             {breadcrumbId=ID-Dell-PC-51429-1581618665098-0-3, CamelFileAbsolute=false, CamelFileAbsolutePath=C:\Users\Dell\eclipse-workspace\camelHelloWorld\input\TIL.txt, CamelFileContentType=text/plain, CamelFileLastModified=1581618006722, CamelFileLength=12050, CamelFileName=TIL.txt, CamelFileNameConsumed=TIL.txt, CamelFileNameOnly=TIL.txt, CamelFileParent=input, CamelFilePath=input\TIL.txt, CamelFileRelativePath=TIL.txt, CamelRedelivered=false, CamelRedeliveryCounter=0}
    BodyType            org.apache.camel.component.file.GenericFile
    Body                [Body is file based: GenericFile[TIL.txt]]
]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
java.lang.IllegalArgumentException: Unexpected / unmapped characters found at the end of the fixed-length record at line : 2
    at org.apache.camel.dataformat.bindy.BindyFixedLengthFactory.bind(BindyFixedLengthFactory.java:281)
    at org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat.createModel(BindyFixedLengthDataFormat.java:262)
    at org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat.unmarshal(BindyFixedLengthDataFormat.java:196)
    at org.apache.camel.processor.UnmarshalProcessor.process(UnmarshalProcessor.java:67)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:433)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Попытка преобразовать фиксированный формат файла с использованием следующего:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
 "id",
 "name",
  .
  .
})
@XmlRootElement(name = "Til")
@FixedLengthRecord(length = 239)
public class Til {

 @XmlElement(name = "ID", required = true)
 @DataField(pos = 1, length = 4)
 protected String id;

 @XmlElement(name = "NAME", required = true)
 @DataField(pos = 5, length = 15)
 protected String name;
 .
 .
}

Всего в файле 239 символов.

Что может быть причиной этой ошибки? Какой-либо вид отделки или прокладки требуется исправить это?

1 Ответ

1 голос
/ 20 февраля 2020

Это можно преодолеть, применив следующий код к вашему классу POJO. По сути, это говорит Бинди игнорировать символы, которые следуют за последними сопоставленными данными фиксированной длины согласно POJO.

@FixedLengthRecord(ignoreTrailingChars = true)

Возможно, вы сможете открыть свой файл в блокноте ++ после включения режима Вид -> Показать символ -> Показать все символы и посмотреть, присутствуют ли какие-либо символы в конце. Эти символы обычно замечаются при работе с файлами, созданными в другой ОС. Вы также можете дважды проверить сопоставление, чтобы убедиться, что все поля действительно сопоставлены согласно правильной длине, что может go легко остаться незамеченным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...