2017-05-07 1 views
0

Ich habe eine CSV-Datei, die 4 Zeilen enthält. Schritt wird normal ausgeführt, aber es wird ein Fehler ausgegeben, wenn es über die 4. Zeile hinausgeht und ich nur 4 Zeilen habe.Wie wird das Ende der CSV-Datei mit Spring Batch angezeigt?

in fieledSetMapper Klasse I zeigen die Linien meiner Datei

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; 

} 

}

Und dieser Fehler

org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 5 in resource=[URL [file:C:/Temp/kk/xx.csv]], input=[;;;;;] 

erscheint Aber ich weiß nicht, wie das Ende der, um anzuzeigen, Datei sollte es normalerweise automatisch machen? Nein ?

PS: Ich laden Sie die Datei primefaces als UploadedFile verwenden Und ich wandeln es mit dieser Methode es in einer temporären Datei zu setzen und für die Charge es abzurufen und anzuwenden nachfolgende Verarbeitung

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


} 

Und hier ist mein Feder-batch-Kontext

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

Antwort

0

Ihre 5.Leine scheint Mapper Ihre BatchFieldSetMapper leere Werte wird mit versagt so Ihre Leser wirft ein exception.Can Sie Ihre Mapper für nULL-Werte überprüfen.

+0

danke du warst das Problem sein Ork jetzt. Danke. Aber ich habe ein anderes Problem mit Version Frühjahr Batch und überwintern Ich verwende Spring Batch 3.0.1 und Hibernate-Core 3.6.3.final und ich habe einen Fehler, wenn ich Daten in mysql java.lang einfügen möchten. NoSuchMethodError: org.hibernate.SessionFactory.getCurrentSession() Lorg/Ruhezustand/Sitzung; \t bei org.springframework.batch.item.database.HibernateItemWriter.doWrite (HibernateItemWriter.java:134) \t bei org.springframework.batch.item.database.HibernateItemWriter.write (HibernateItemWriter.java:113) –

+1

können Sie überprüfen, Dieser Link für mehr Details http://stackoverflow.com/questions/43832143/java-lang-nosuchmethoderror-org-hibernate-sessionfactory-getcurrensessionlor –

Verwandte Themen