spring-batch read in null int values

I have a file reader to read a customer csv file If the int fields are empty i get error 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: ""]

الطبقة لقراءة الملف. كيف تتم قراءة وظيفة الدفعة الربيعية ، التعامل مع قيم int null.

السطر الثاني من ملف البيانات csv يلقي خطأ فارغ!

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


     DelimitedLineTokenizer delimitedTokeniser = new DelimitedLineTokenizer();
     delimitedTokeniser.setNames(new String[]{"valueA", "custPaymentTerm","valueC"});
     DefaultLineMapper lineMapper = new DefaultLineMapper();
     lineMapper.setLineTokenizer(delimitedTokeniser);
     lineMapper.setFieldSetMapper(new BeanWrapperFieldSetMapper() {{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 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
0
كيف يمكنني الحصول على linemapper للتعامل معها؟
وأضاف المؤلف Jacel, مصدر
يجب أن يحدث السحر في linemapper الخاص بك. يتم إعطاء LineMapper خطًا خامًا ، مما يعني أن هناك عملًا يلزم القيام به لتعيين الحقول بشكل مناسب
وأضاف المؤلف alainlompo, مصدر
إذا كانت لديك قيم فارغة ، فلماذا لا تحدد custPaymentTerm كعدد صحيح؟
وأضاف المؤلف Simon Martinelli, مصدر
يمكنك تحديد custPaymentTerm كـ Integer أو String وقراءة كافة البيانات باستخدام القارئ ثم معالجة أو معالجة القيم الخالية في المعالج.
وأضاف المؤلف The Guest, مصدر
هل حاولت تغيير نوع custPaymentTerm من int إلى Integer ؟
وأضاف المؤلف Jack, مصدر

1 إجابة

بدلا من استخدام الربيع قدمت BeanWrapperFieldSetMapper ، يجب عليك كتابة التطبيق الخاص بك من FieldSetMapper وإضافة ذلك إلى linemapper الخاص بك.

 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)' القيمة الافتراضية في حالة قراءة قيمة فارغة من السطر.

0
وأضاف