Как вызвать соответствующий Item Processor для разных записей? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть плоский файл, содержащий разные записи (верхний колонтитул, запись и нижний колонтитул)

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 ??

1 Ответ

0 голосов
/ 14 октября 2019

Ваша проблема в том, что классификатор, который вы используете в ClassifierCompositeItemProcessor, основан на шаблоне String, а не на типе. Что действительно должно произойти, это что-то вроде:

Считыватель возвращает элементы определенного типа на основе шаблона ввода, например:

  • HR * -> HRType
  • RD * -> RDType
  • FR * -> FRType

Это то, что вы в основном сделали на стороне читателя. Теперь на стороне обработки процессор получит объекты типа HRType, RDType и FRType. Таким образом, классификатор должен основываться не на String как входном типе, а на типе элемента, например:

    Map<Object, ItemProcessor> patternMap = new HashMap<>();
    patternMap.put(HRType.class, new HeaderItemProcessor());
    patternMap.put(RDType.class, new RecordItemProcessor());
    patternMap.put(FRType.class, new FooterItemProcessor());

Этот классификатор использует тип Object, поскольку ваш ItemReader возвращает необработанный тип. Я бы не рекомендовал бы использовать необработанные типы и Object тип в классификаторе. Что вы должны сделать:

  1. создать базовый класс для ваших предметов и определенный класс для каждого типа
  2. Заставить читателя возвращать предметы типа <? extends BaseClass>
  3. Используйте org.springframework.classify.SubclassClassifier в вашем ClassifierCompositeItemProcessor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...