【问题标题】:spring batch - FlatFileItemReader - token is of type objectspring batch - FlatFileItemReader - 令牌是对象类型
【发布时间】:2018-03-31 21:24:41
【问题描述】:

我第一次在我的应用程序中使用 spring batch 和 spring data jpa。 Spring批量读取一个文本文件,上面写着aCode,aName,sCode。 我有一个 POJO 映射这些键,如下所示,其中一个键是另一种类型的对象

 public class Pojo{
  private AnotherObject sCode;  
  private String aName;
  private String aCode;
 }

下面是我在 BatchConfiguration 课程中的读者。 我该如何处理这个另一个对象。 我收到一条错误消息:

原因:org.springframework.beans.NotWritablePropertyException:bean 类 [Pojo] 的无效属性“sCode”:在输入键中找到此属性的距离

 @Bean
  @StepScope
  public FlatFileItemReader<Area> reader(
      @Value("#{stepExecutionContext[fromId]}") final String fromId,
      @Value("#{stepExecutionContext[toId]}") final String toId,
      @Value("#{stepExecutionContext[name]}") final String name) {
    FlatFileItemReader<Area> reader = new FlatFileItemReader<>();
    try{

      reader.setResource(new ClassPathResource("area_temp.txt"));   
      LineMapper<Area> areaMapper = createAreaLineMapper();
      reader.setLineMapper(areaMapper);
    }
    catch(Exception e){
      e.printStackTrace();
    }
    return reader;
  }

  private LineMapper<Area> createAreaLineMapper() {
    DefaultLineMapper<Area> areaLineMapper = new DefaultLineMapper<>();

    LineTokenizer areaTokenizer = createAreaTokenizer();
    areaLineMapper.setLineTokenizer(areaTokenizer);

    FieldSetMapper<Area> areaInformationMapper = createAreaInformationMapper();
    areaLineMapper.setFieldSetMapper(areaInformationMapper);

    return areaLineMapper;
}

 private LineTokenizer createAreaTokenizer() {
    DelimitedLineTokenizer areaLineTokenizer = new DelimitedLineTokenizer();
    areaLineTokenizer.setDelimiter("|");
    areaLineTokenizer.setNames(new String[]{"sCode","aCode","aName"});
    return areaLineTokenizer;
}
 private FieldSetMapper<Area> createAreaInformationMapper() {
    BeanWrapperFieldSetMapper<Area> areaMapper = new BeanWrapperFieldSetMapper<>();
    areaMapper.setTargetType(Area.class);
    return areaMapper;
}

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    这个例外是不言自明的。 BeanWrapperFieldSetMapper 允许对名称进行模糊匹配。您可以通过距离配置它的模糊程度。您可以在此处阅读有关在 javadoc 中设置该距离的更多信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapper.html#setDistanceLimit-int-

    【讨论】:

    • 感谢您的意见。当 pojo 和 {"sCode","aCode","aName"} 中的名称匹配时,我们为什么要覆盖距离限制。距离限制应该 > 5 还是小于 5
    • 在我将其设置为 areaMapper.setDistanceLimit(0);那个问题已经消失了,但我得到另一个错误说“由:org.springframework.beans.NotWritablePropertyException:bean 类 [Pojo] 的无效属性 'ePCode':Bean 属性'ePCode' 不可写或具有无效的 setter 方法。是否setter 的参数类型是否与 getter 的返回类型匹配?”我敢肯定,AnotherObject 具有 ePCode 的公共 getter 和公共 setter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2020-09-14
    • 2021-11-12
    相关资源
    最近更新 更多