Spring Batch ItemReader получает исключение NullPointerException в первой строке

У меня есть эта проблема с пакетом Spring, когда я пытаюсь прочитать свои CSV-файлы.

Мне нужно прочитать CSV с такой структурой:

valueHeader;valueHeader;valueHeader;valueHeader;valueHeader;valueHeader
conventValue;conventValue;conventValue;conventValue;conventValue
conventValue;conventValue;conventValue;conventValue;conventValue
conventValue;conventValue;conventValue;conventValue;conventValue
valueFooter;valueFooter;valueFooter;valueFooter;valueFooter;valueFooter

У меня есть MultiResourceItemReader, который делегирует FlatFileItemReader типа String, чтобы упростить сопоставление этих строк с моим пользовательским DTO в пользовательском обработчике элементов, который выполняется после.

В моем тасклете я внедрил свой bean-компонент MultiResourceItemReader следующим образом:

@Autowired
    private MultiResourceItemReader<String> resourceItemReader;

Затем я вызываю это так (устанавливаю ресурсы и контекст):

    resourceItemReader.setStrict(Boolean.FALSE);
    resourceItemReader.setResources(resources);
    resourceItemReader.open(context.getStepContext().getStepExecution().getExecutionContext());

    String currentContent = resourceItemReader.read();
    while(currentContent != null) {
        linesReaded.add(currentContent);
        currentContent = resourceItemReader.read();
    }

But I am getting a **NullPointerException** in the first Line and I don't know why:

20190705 19:53:30.041 INFO   com.mycomp.mycustomp.tasklet.MyCustomTasklet [[ # ]] - [MyCustomTasklet:EXECUTE]
20190705 19:53:41.560 ERROR  org.springframework.batch.core.step.AbstractStep [[ # ]] - Encountered an error executing step processRebateASLIStep in job MyProyectJob
org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 1 in resource=[file [C:\Pruebas\MyProyectJob\destino\MyFile-100-20151130143000-000001.csv]], input=[HEADER;PEP;FacteTRY;100; 20151130143000;000125;100000000000000000000000000000000025874]
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:183)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:88)
    at org.springframework.batch.item.file.MultiResourceItemReader.readFromDelegate(MultiResourceItemReader.java:140)
    at org.springframework.batch.item.file.MultiResourceItemReader.readNextItem(MultiResourceItemReader.java:119)
    at org.springframework.batch.item.file.MultiResourceItemReader.read(MultiResourceItemReader.java:108)
....
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: java.lang.NullPointerException: null
    at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:43)
    at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:180)
    ... 59 common frames omitted

Я также прикреплю свои bean-компоненты readerItems:

@Bean
        MultiResourceItemReader<String> resourceItemReader(FlatFileItemReader<String> flatFileItemReader){
            MultiResourceItemReader<String> resourceItemReader = new MultiResourceItemReader<>();
            resourceItemReader.setDelegate(flatFileItemReader);
            resourceItemReader.setStrict(false);
            return resourceItemReader;
        }

    @Bean
    FlatFileItemReader<String> flatFileItemReader() {

        FlatFileItemReader<String> reader = new FlatFileItemReader<String>();
        reader.setStrict(false);
        reader.setLineMapper(new DefaultLineMapper<String>() {
        {
            //Setea los valores en la clase indicada
            setFieldSetMapper(new FieldSetMapper<String>() {

                @Override
                public String mapFieldSet(FieldSet fieldSet) throws BindException {
                    String[] values = fieldSet.getValues();
                    return String.join(";", values);
                }

            });

            }
        });

        return reader;
    }

Основной причиной является исключение нулевого указателя в строке 43 файла DefaultLineMapper.java. Какая именно это строчка?

Cuga 05.07.2019 20:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
2 659
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не установили токенизатор линии на свой LineMapper. Вот как его добавить:

    reader.setLineMapper(new DefaultLineMapper<String>() {
        {
            //Setea los valores en la clase indicada
            setFieldSetMapper(new FieldSetMapper<String>() {

                @Override
                public String mapFieldSet(FieldSet fieldSet) throws BindException {
                    String[] values = fieldSet.getValues();
                    return String.join(";", values);
                }

            });

            setLineTokenizer(new DelimitedLineTokenizer(";"));

        }
    });

Я бы рекомендовал использовать FlatFileItemReaderBuilder, который более интуитивно понятен благодаря свободному API. Вот пример:

@Bean
public FlatFileItemReader<Pojo> flatFileItemReader() {
    return new FlatFileItemReaderBuilder<Pojo>()
            .name("itemReader")
            .resource(new FileSystemResource("/path/to/flat/file"))
            .targetType(Pojo.class)
            .delimited()
            .delimiter(";")
            .names("column1", "column2")
            .build();
}

Надеюсь это поможет.

О, я вижу, спасибо за помощь. Весенняя партия для меня пока немного странная :)

JuniorGuy 08.07.2019 08:42

Рекомендую использовать FlatFileItemReaderBuilder. Я добавил пример к ответу.

Mahmoud Ben Hassine 08.07.2019 10:10

Другие вопросы по теме