reader.read () дает исключение нулевого указателя для первой строки - FlatFileItemReader в Spring Batch - PullRequest
0 голосов
/ 02 апреля 2020

Я получаю NullPointerException в reader.read (). Я не знаю, что я делаю неправильно. Ниже мой класс Reader.

org.springframework.batch.item.file.FlatFileParseException: Ошибка синтаксического анализа в строке: 1 в ресурсе = [файл [C: \ RDS \ finalObj.txt] ], вход = [СТУДЕНТ, 1, Калдане]

public class MultiLineTradeItemReader extends AbstractItemCountingItemStreamDelegateReader<Student> {
@Override
protected Student doRead() throws Exception {
    Student t=null;
    t= studentFieldSetMapper().mapFieldSet(reader.read());
    return t;
}

@Override
protected void doOpen(ExecutionContext executionContext) throws Exception {
    reader= new FlatFileItemReader<FieldSet>();
    try {

        reader.setResource(new FileSystemResource("C:\\RDS\\finalObj.txt"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    setName("myReader");
    reader.setLineMapper(orderFileLineMapper());
    reader.open(executionContext);
}
@Bean
public PatternMatchingCompositeLineMapper orderFileLineMapper() {
    PatternMatchingCompositeLineMapper lineMapper =
            new PatternMatchingCompositeLineMapper();
    Map<String, LineTokenizer> tokenizers = new HashMap<>(3);
    tokenizers.put("STUDENT*", studentDelimeter());
    lineMapper.setTokenizers(tokenizers);
    Map<String, FieldSetMapper> mappers = new HashMap<>(2);
    mappers.put("STUDENT*", studentFieldSetMapper());
    lineMapper.setFieldSetMappers(mappers);
    return lineMapper;
}
@Bean
public FieldSetMapper<Student> studentFieldSetMapper() {
    BeanWrapperFieldSetMapper<Student> fieldSetMapper = new BeanWrapperFieldSetMapper();

    fieldSetMapper.setPrototypeBeanName("student");

    return fieldSetMapper;
}

@Bean
@Scope("prototype")
public Student student() {
    return new Student();
}



private LineTokenizer studentDelimeter() {
    DelimitedLineTokenizer delimitedLineTokenizer= new DelimitedLineTokenizer(",");
    delimitedLineTokenizer.setNames("tableName","rollno","studentname");
    return delimitedLineTokenizer;
}
}

1 Ответ

0 голосов
/ 02 апреля 2020

Я не знаю, что я делаю неправильно

Вы определяете читателя в методе doOpen:

@Override
protected void doOpen(ExecutionContext executionContext) throws Exception {
   reader= new FlatFileItemReader<FieldSet>();
   try {

    reader.setResource(new FileSystemResource("C:\\RDS\\finalObj.txt"));
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   setName("myReader");
   reader.setLineMapper(orderFileLineMapper());
   reader.open(executionContext);
}

Это не правильно. Считыватель делегата может быть передан во время создания или с помощью установщика, как показано в примере MultiLineTradeItemReader .

...