【问题标题】:How to write this method in a generic way in java如何在java中以通用方式编写此方法
【发布时间】:2019-08-13 10:28:27
【问题描述】:

目前,我为五个不同的类实现了此方法,为五个不同的文本文件配置 FlatFileReader 并加载到 DB 表中。

我想知道有没有办法在一个通用的地方实现这个方法,这样我的每个文件都会调用这个方法来配置我的阅读器读取它们对应的文件..

每个文件都会发送不同的实体类来加载他们的文件。比如主实体、ChildEntity1、ChildEntity2、ChildEntity3、ChildEntity4。

private void flatFileItemReaderConfig(FlatFileItemReader<PrimaryEntity> flatFileReader,
        String fileName, String incomingHeader)
{
    // set delimiter as '|'
    DefaultLineMapper<PrimaryEntity> defaultLineMapper = new DefaultLineMapper<>();

    DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer("|");
    delimitedLineTokenizer.setNames(convertHeaderToEntityAttrib(fileName, incomingHeader));
    defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);

    // convert each record into primaryentity
    BeanWrapperFieldSetMapper<PrimaryEntity> beanWrapperFieldSetMapper = new BeanWrapperFieldSetMapper<>();
    beanWrapperFieldSetMapper.setTargetType(PrimaryEntity.class);
    beanWrapperFieldSetMapper.setCustomEditors(getCustomFormatters());

    defaultLineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);

    flatFileReader.setLineMapper(defaultLineMapper);
}

【问题讨论】:

  • 哪些类有共享功能?这个方法是重复的吗?
  • @cameron1024 是的,仅此方法...FlatFileItemReader> 正如我在问题中提到的那样,它将具有不同的实体类..
  • 这似乎已经是通用的了。如果将FlatFileItemReader&lt;PrimaryEntity&gt; 替换为FlatFileItemReader&lt;ChildEntity1&gt;,会出现错误吗?如果是这样,这些错误是什么。

标签: java java-8 spring-batch flatfilereader


【解决方案1】:

为方法添加泛型

private <T> void flatFileItemReaderConfig(FlatFileItemReader<T> flatFileReader, String fileName, String incomingHeader, Class<T> clazz) {

    // set delimiter as '|'
    DefaultLineMapper<T> defaultLineMapper = new DefaultLineMapper<>();

    DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer("|");
    delimitedLineTokenizer.setNames(convertHeaderToEntityAttrib(fileName, incomingHeader));
    defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);

    // convert each record into primary entity
    BeanWrapperFieldSetMapper<T> beanWrapperFieldSetMapper = new BeanWrapperFieldSetMapper<>();
    beanWrapperFieldSetMapper.setTargetType(clazz);
    beanWrapperFieldSetMapper.setCustomEditors(getCustomFormatters());
    defaultLineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);
    flatFileReader.setLineMapper(defaultLineMapper);
}

如果您只想将使用限制为列出的实体,请创建一个由所有具体实体实现的通用接口实体 (PrimaryEntity, ChildEntity1, ChildEntity2, ChildEntity3, ChildEntity4) 并将签名更改为

private <T extends Entity> void flatFileItemReaderConfig(...)

【讨论】:

  • 我会避免将方法设为静态,因为它会使测试复杂化。
  • @Jardo 删除了我关于静态的评论,因为它与问题无关。
猜你喜欢
  • 1970-01-01
  • 2023-01-01
  • 2011-06-18
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多