2 votes

Utilisation du Factory Pattern dans Spring Batch FileHeaderFieldSetMapper

Je suis en train de mettre en place une tâche Spring Batch qui traitera un fichier multi-enregistrements. L'un des enregistrements a la structure suivante.

Ind,RecCode,AccNum,RecTypeDesc,EffectiveDate,CreditAmount,DebitAmount,BatchNumber,NumberOfTrasactions 
5, 20, 100, prl, 12084, as0, 0, 3, 1

Selon la valeur du champ RecordCode, il s'agira d'un enregistrement de paiement ou d'un enregistrement d'annulation.

Je suis en train de mettre en place le PatternMatchingCompositeLineMapper pour lire les types d'enregistrements dans le fichier. J'ai créé les 2 classes d'implémentation de FieldSetMapper suivantes

@Component("paymentBatchFieldSetMapper")
public class  PaymentBatchFieldSetMapper implements FieldSetMapper<PaymentBatch> {

    @Override
    public PaymentBatch mapFieldSet(FieldSet fieldSet) throws BindException {
        // TODO Auto-generated method stub
        return null;
    }
}

et le second comme,

@Component("reversalBatchFieldSetMapper")
public class  ReversalBatchFieldSetMapper implements FieldSetMapper<PaymentBatch> {

    @Override
    public PaymentBatch mapFieldSet(FieldSet fieldSet) throws BindException {
        // TODO Auto-generated method stub
        return null;
    }
}

J'ai créé une classe d'usine comme suit pour retourner l'un ou l'autre des 2 éléments ci-dessus comme ci-dessous

@Component("achBatchFieldSetMapperFactory")
public class ACHBatchFieldSetMapperFactory {

    @Autowired
    private ApplicationContext applicationContext;

    public FieldSetMapper<? extends AbstractACHBatch> getFieldSetMapper(RecordTypeDescription recordTypeDescription) {
        FieldSetMapper<? extends AbstractACHBatch> fieldSetMapper = null;
        switch(recordTypeDescription) {
        case PAYMENT:
            fieldSetMapper = applicationContext.getBean(PaymentBatchFieldSetMapper.class);
            break;
        case REVERSAL:
            fieldSetMapper = applicationContext.getBean(ReversalBatchFieldSetMapper.class);
            break;
        }
        return fieldSetMapper;
    }
}

Voici la configuration du bean pour l'objet map à injecter dans PatternMatchingCompositeLineMapper.

@Bean
public Map<String, LineTokenizer> fieldSetMapperMap(FileHeaderFieldSetMapper fileHeaderFieldSetMapper, PaymentBatchFieldSetMapper paymentBatchFieldSetMapper,
        ReversalBatchFieldSetMapper reversalBatchFieldSetMapper) {
    Map<String, FieldSetMapper> map = new HashMap<String, FieldSetMapper>();
    map.put("1*", fileHeaderFieldSetMapper);
    map.put("5*", ?????);                   
}

Est-il possible d'utiliser l'usine pour renvoyer le mappeur FieldSet nécessaire en fonction de l'enregistrement dans le fichier ?

1voto

Mahmoud Ben Hassine Points 8546

Le lecteur d'articles est conçu pour renvoyer un seul type d'articles à la fois. Imaginons que nous parvenions à faire correspondre les enregistrements à l'un des deux types suivants PaymentBatch o ReversalBatch selon le RecordCode ce qui signifie qu'après le mappage, le champ ItemReader renverrait deux types. Cela n'est pas possible par conception.

Ce que vous pouvez faire, c'est créer un POJO qui a un mappage un-à-un avec les champs de votre fichier d'entrée, puis utiliser une fonction ClassifierCompositeItemProcessor pour traiter chaque élément en fonction de son type (Le classificateur serait basé sur le RecordTypeDescription dans votre cas).

NB : Il est bien sûr techniquement possible d'oublier le type générique de l'interface utilisateur. ItemReader<T> et faire en sorte que le lecteur d'éléments renvoie Object mais cela nécessiterait l'utilisation laide de instanceof dans votre processeur pour déterminer le type d'enregistrement. Je recommande vivement no en utilisant cette approche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X