У меня есть плоский файл, содержащий разные записи (верхний колонтитул, запись и нижний колонтитул)
HR,...
RD,...
FR,...
ItemReader
@Bean
@StepScope
public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource(inputFileName));
reader.setLineMapper(patternLineMapper());
return reader;
}
@Bean
public LineMapper patternLineMapper() {
PatternMatchingCompositeLineMapper patternLineMapper = new PatternMatchingCompositeLineMapper<>();
tokenizers = new HashMap<String, LineTokenizer>();
try {
tokenizers.put("HR*", headerLineTokenizer());
tokenizers.put("RD*", recordLineTokenizer());
tokenizers.put("FR*", footerLineTokenizer());
} catch (Exception e) {
e.printStackTrace();
}
fieldSetMappers = new HashMap<String, FieldSetMapper>();
fieldSetMappers.put("HR*", new HeaderFieldSetMapper());
fieldSetMappers.put("RD*", new RecordFieldSetMapper());
fieldSetMappers.put("FR*", new FooterFieldSetMapper());
patternLineMapper.setTokenizers(tokenizers);
patternLineMapper.setFieldSetMappers(fieldSetMappers);
return patternLineMapper;
}
Они работают нормально, и пакетная пружина вызывает соответствующиеСчитыватель для каждой записи проблема в том, что когда дело доходит до процессора элементов, я хочу использовать тот же подход, который я получаю java.lang.ClassCastException
Потому что пружинная партия пытается отобразить объект домена [возвращено из считывателя] в java.lang.String
ItemProcessor
@Bean
@StepScope
public ItemProcessor processor() {
ClassifierCompositeItemProcessor processor = new ClassifierCompositeItemProcessor();
PatternMatchingClassifier<ItemProcessor> classifier = new PatternMatchingClassifier<>();
Map<String, ItemProcessor> patternMap = new HashMap<>();
patternMap.put("HR*", new HeaderItemProcessor());
patternMap.put("RD*", new RecordItemProcessor());
patternMap.put("FR*", new FooterItemProcessor());
classifier.setPatternMap(patternMap);
processor.setClassifier(classifier);
return processor;
}
Я также использовал BackToBackPatternClassifier
, но оказалось, что в нем есть ошибка, и когда я использую такие обобщенные элементы, как ItemWriter<Object>
, я получаю исключение Не удалось открыть файл. вопрос Как я могу создать ItemProcessor, который обрабатывает разные типы записей, возвращаемых из Reader ??