【问题标题】:spring-batch read in null int valuesspring-batch 读入 null int 值
【发布时间】:2018-10-05 19:44:37
【问题描述】:

我有一个文件阅读器来读取客户的 csv 文件 如果 int 字段为空 我收到错误Field error in object 'target' on field 'custPaymentTerm': rejected value []; codes [typeMismatch.target.custPaymentTerm,typeMismatch.custPaymentTerm,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.custPaymentTerm,custPaymentTerm]; arguments []; default message [custPaymentTerm]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'custPaymentTerm'; nested exception is java.lang.NumberFormatException: For input string: ""]

读取文件的类。 spring-batch-job 如何读取、处理 null int 值。

我的csv数据文件第二行抛出null错误!

public static void readCustomers(String pathToFile) throws Exception {  
     System.out.println(" THE path is:"+pathToFile);
     FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
     reader.setResource(new FileSystemResource(pathToFile));


     DelimitedLineTokenizer delimitedTokeniser = new DelimitedLineTokenizer();
     delimitedTokeniser.setNames(new String[]{"valueA", "custPaymentTerm","valueC"});
     DefaultLineMapper<Customer> lineMapper = new DefaultLineMapper<Customer>();
     lineMapper.setLineTokenizer(delimitedTokeniser);
     lineMapper.setFieldSetMapper(new BeanWrapperFieldSetMapper<Customer>() {{setTargetType(Customer.class);}});
     reader.setLineMapper(lineMapper);
     reader.setLinesToSkip(1); //do not read the first line of the csv file.
     reader.open(new ExecutionContext());
     Customer store = null;
     List<Customer> stores = new ArrayList<>();
     do {
         store = reader.read();
         if (store != null) {
             System.out.println("######## ------->"+store.getCustPaymentTerm());
             stores.add(store);
         }
     } while (store != null);
}

public Customer(){
    String valueA;
    int custPaymentTerm;
    String valueC;
}

数据文件内容

apple,1,cat
dog,,rat

【问题讨论】:

  • 您是否尝试将custPaymentTerm 属性的类型从int 更改为Integer
  • 如果您有空值,为什么不将 custPaymentTerm 定义为整数?
  • 魔法应该发生在您的线路映射器中。 LineMapper 有一条原始线,这意味着需要做一些工作来适当地映射字段
  • 如何让 linemapper 处理它?
  • 您可以将 custPaymentTerm 定义为 Integer 或 String 并使用 reader 读取所有数据,然后在您的处理器中处理或处理 null。

标签: java spring-boot spring-batch


【解决方案1】:

您应该编写自己的 FieldSetMapper 实现并将其添加到您的 linemapper,而不是使用 Spring 提供的 BeanWrapperFieldSetMapper。

 lineMapper.setFieldSetMapper(new MyCustomFieldSetMapper());

在该类的 mapFieldSet(...) 方法中,您可以创建一个包含所有映射字段的新客户。这可能看起来像这样:

Customer mapFieldSet(FieldSet fs) {
    Customer customer = new Customer();
    customer.setCustPaymentTerm(fs.readInt("custPaymentTerm", 0);
    // set your other fields here
    return customer;
}

'readInt(..., 0)' 调用中的零是默认值,以防从行中读取空白值。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2023-03-25
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多