0
我有一個包含4行的csv文件。 步驟執行正常,但它超出第4行時會引發錯誤,而且只有4行。如何使用spring批量指示csv文件的結束?
在fieledSetMapper類我顯示我的文件
public class BatchFieldSetMapper implements FieldSetMapper<Batch>{
@Override
public Batch mapFieldSet(FieldSet fieldSet) throws BindException {
Batch result = new Batch();
result.setInstitution(fieldSet.readString(0));
System.out.println("Institution ==> " + result.getInstitution());
result.setType(fieldSet.readString(1));
System.out.println("Type ==> " + result.getType());
result.setNom(fieldSet.readString(2));
System.out.println("Nom ==> " + result.getNom());
result.setRubrique(fieldSet.readString(3));
System.out.println("Rubrique ==> " + result.getRubrique());
result.setMontantPaye(fieldSet.readDouble(4));
System.out.println("MT P ==> " + result.getMontantPaye());
result.setMontantRetenu(fieldSet.readDouble(5));
System.out.println("MT R ==> " + result.getMontantRetenu());
return result;
}
}
的線條和這個錯誤出現
org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 5 in resource=[URL [file:C:/Temp/kk/xx.csv]], input=[;;;;;]
但我不知道如何表示的結束文件通常應該自動執行它?不是?
PS:我上傳使用primefaces作爲UploadedFile的文件,我用這個方法把它放在一個臨時文件,批處理進行檢索並應用後續處理
public void uploadFile(FileUploadEvent e) throws IOException{
UploadedFile uploadedCsv=e.getFile();
String filePath="C:/Temp/kk/xx.csv";
byte[] bytes=null;
if(uploadedCsv != null){
bytes=uploadedCsv.getContents();
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
String filename = FilenameUtils.getName(uploadedCsv.getFileName());
stream.write(bytes);
stream.close();
}
ApplicationContext context = new ClassPathXmlApplicationContext("spring-batch-context.xml");
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("batchJob");
try {
JobExecution execution = jobLauncher.run(job, new JobParameters());
} catch (JobExecutionException e1) {
System.out.println("Job Batch failed");
e1.printStackTrace();
}
}
轉換這裏是我的彈簧批上下文
<!-- JobRepository and JobLauncher are configuration/setup classes -->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" />
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<!-- à voir comment récuperer le nom du fichier et le mettre au value -->
<bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="file:C:/Temp/kk/xx.csv" />
<property name="delegate" ref="flatFileItemReader" />
</bean>
<!-- ItemReader reads a complete line one by one from input file -->
<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="fieldSetMapper">
<!-- Mapper which maps each individual items in a record to properties in POJO -->
<bean class="ma.controle.gestion.springbatch.BatchFieldSetMapper" />
</property>
<property name="lineTokenizer">
<!-- A tokenizer class to be used when items in input record are separated by specific characters -->
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";" />
</bean>
</property>
</bean>
</property>
</bean>
<!-- ItemWriter which writes data to database -->
<bean id="databaseItemWriter" class="org.springframework.batch.item.database.HibernateItemWriter">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Optional ItemProcessor to perform business logic/filtering on the input records -->
<bean id="itemProcessor" class="ma.controle.gestion.springbatch.BatchItemProcessor" />
<!-- Optional JobExecutionListener to perform business logic before and after the job -->
<bean id="jobListener" class="ma.controle.gestion.springbatch.BatchJobItemListener" />
<!-- Actual Job -->
<batch:job id="batchJob">
<batch:step id="step1">
<batch:tasklet transaction-manager="txManager">
<batch:chunk reader="multiResourceItemReader" writer="databaseItemWriter"
processor="itemProcessor" commit-interval="10" />
</batch:tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="jobListener" />
</batch:listeners>
</batch:job>
謝謝你這是它現在的問題。謝謝你。 但我有版本春天批次和休眠 另一個問題我使用春天批處理3.0.1和休眠核心3.6.3.final和我有一個錯誤,當我想插入數據到mysql java.lang。 NoSuchMethodError:org.hibernate.SessionFactory.getCurrentSession()Lorg/hibernate/Session; \t在org.springframework.batch.item.database.HibernateItemWriter.doWrite(HibernateItemWriter.java:134) \t在org.springframework.batch.item.database.HibernateItemWriter.write(HibernateItemWriter.java:113) –
你能檢查此鏈接更多詳細信息http://stackoverflow.com/questions/43832143/java-lang-nosuchmethoderror-org-hibernate-sessionfactory-getcurrentsessionlor –