2017-05-07 11 views
0

私は4行を含むcsvファイルを持っています。 ステップは正常に実行されますが、4行目以降は4行しか表示されません。 fieledSetMapperクラスの スプリングバッチを使用してCSVファイルの終わりを示す方法は?

は、私は私のファイル

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:に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(); 
    } 


} 

以降の処理を適用するために一時ファイルに、バッチのためにそれを置くために、このメソッドを使用して、そして、ここに私のある変換するように私はprimefacesを使用してファイルをアップロード春-バッチコンテキスト

<!-- 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> 

答えて

0

あなたの第5行目は空の値を持っているあなたのBatchFieldSetMapperマッパーは、ので、あなたの読者はあなたがnull値のためのあなたのマッパーをチェックexception.Canを投げて失敗しているようです。

+0

ありがとうございました。ありがとう。 しかし、私はバージンバッチと休止状態の別の問題があります 私は春のバッチ3.0.1を使用しているとコア3.6.3.finalを休止し、私はmysqlにデータを挿入するときにエラーが発生しました java.lang。 NoSuchMethodError:org.hibernate.SessionFactory.getCurrentSession()Lorg/hibernate/Session; org.springframework.batch.item.database.HibernateItemWriter.write(HibernateItemWriter.java:113) –

+1

で org.springframework.batch.item.database.HibernateItemWriter.doWriteで\t(HibernateItemWriter.java:134) \t次のことが確認できこのリンクは、詳細についてはhttp://stackoverflow.com/questions/43832143/java-lang-nosuchmethoderror-org-hibernate-sessionfactory-getcurrentsessionlor –

関連する問題