Динамически применять пользовательскую логику для каждого элемента при создании пакетного файла в весеннем пакетном режиме - PullRequest
0 голосов
/ 12 марта 2019

У нас есть требование, чтобы пользователи выбирали столбцы для вывода в пакетном файле.Некоторые из столбцов имеют логику, например, для: - Если пол - мужской, используйте код 1, для женского - 2 и т. Д.,

Мы хотели бы дать пользователям возможность определять собственную логику.Вопрос в том, каков наилучший способ динамического применения этой логики при генерации выходных данных в Spring Batch?

1 Ответ

0 голосов
/ 13 марта 2019

Интерфейс стратегии LineAggregator позволяет вам определить, как объединить элемент в строку для записи в выходной файл. Вы можете реализовать свою собственную логику там. Вот быстрый пример:

static class Person {
    private int id;
    private String name;
    private Gender gender;
    enum Gender {
        M, F;
    }
}

class PersonLineAggregator implements LineAggregator<Person> {
    @Override
    public String aggregate(Person person) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(person.id).append(",");
        stringBuilder.append(person.name).append(",");
        stringBuilder.append(person.gender.equals(Person.Gender.M) ? 1 : 0);
        return stringBuilder.toString();
    }
}

Как только вы определили свой агрегатор строк, вы можете использовать его в FlatFileItemWriter:

@Bean
public FlatFileItemWriter<Person> personFlatFileItemWriter() {
    return new FlatFileItemWriterBuilder<Person>()
            .name("personWriter")
            .resource(new FileSystemResource("persons.csv"))
            .lineAggregator(new PersonLineAggregator())
            .headerCallback(writer -> writer.write("id,name,code"))
            .build();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...