2017-08-22 2 views
1

Je suis en train de lire un fichier CSV avec des dates avec Spring Batch, mais je ne parviens pas à l'analyse d'une date dans un LocalDateTime Objet:Utiliser Spring Batch pour analyser la date du fichier dans LocalDateTime

erreur sur le terrain dans objet 'cible' sur le champ 'date': valeur rejetée [2017-07-20 04: 15: 25.0]; codes [typeMismatch.target.date, typeMismatch.date, typeMismatch.java.time.LocalDateTime, typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.date, date]; arguments []; message par défaut [date]]; message par défaut [Impossible de convertir la valeur de propriété de type 'java.lang.String' en type requis 'java.time.LocalDateTime' pour la propriété 'date'; exception imbriquée est java.lang.IllegalStateException: Impossible de convertir la valeur de type « java.lang.String » au type requis « java.time.LocalDateTime » pour les biens « date »: aucun des éditeurs correspondants ou stratégie de conversion trouvés]

Main.java:

public class Main { 
    public static void main(String[] args) { 
     ApplicationContext context = new AnnotationConfigApplicationContext(SpringBatchDateParseConfig.class); 

     JobLauncher jobLauncher = context.getBean(JobLauncher.class); 
     Job job = context.getBean("job", Job.class); 

     JobParameters jobParameters = new JobParametersBuilder().toJobParameters(); 

     try { 
      JobExecution jobExecution = jobLauncher.run(job, jobParameters); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

SpringBatchDateParseConfig.java:

@Configuration 
@EnableBatchProcessing 
public class SpringBatchDateParseConfig { 
    @Inject 
    private JobBuilderFactory jobBuilderFactory; 

    @Inject 
    private StepBuilderFactory stepBuilderFactory; 

    @Bean 
    public Step step1() { 
     return stepBuilderFactory.get("step1") 
           .<TestClass, TestClass>chunk(2) 
           .reader(testClassItemReader()) 
           .writer(testClassItemWriter()) 
           .build(); 
    } 

    @Bean 
    public Job job(Step step1) { 
     return jobBuilderFactory.get("job") 
       .start(step1) 
       .build(); 
    } 

    @Bean 
    FlatFileItemReader<TestClass> testClassItemReader() { 
     FlatFileItemReader<TestClass> flatFileItemReader = new FlatFileItemReader<>(); 
     flatFileItemReader.setResource(new ClassPathResource("test.csv")); 
     flatFileItemReader.setLinesToSkip(1); 
     DefaultLineMapper defaultLineMapper = new DefaultLineMapper(); 
     DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer(); 
     delimitedLineTokenizer.setNames(new String[]{"foo", "bar", "date"}); 

     BeanWrapperFieldSetMapper<TestClass> fieldSetMapper = new BeanWrapperFieldSetMapper<>(); 
     fieldSetMapper.setTargetType(TestClass.class); 

     defaultLineMapper.setLineTokenizer(delimitedLineTokenizer); 
     defaultLineMapper.setFieldSetMapper(fieldSetMapper); 
     flatFileItemReader.setLineMapper(defaultLineMapper); 

     return flatFileItemReader; 

    } 

    @Bean 
    ItemWriter<TestClass> testClassItemWriter() { 
     return new ItemWriter<TestClass>() { 
      @Override 
      public void write(List<? extends TestClass> items) throws Exception { 
       for (TestClass TestClass : items) { 
        System.out.println(TestClass.toString()); 
       } 
      } 
     }; 
    } 
} 

TestClass.java:

public class TestClass { 

    private String foo; 
    private String bar; 
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME, pattern = "yyyy-MM-dd H:m:s.S") 
    private LocalDateTime date; 

    public String getFoo() { 
     return foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    public LocalDateTime getDate() { 
     return date; 
    } 

    public void setDate(LocalDateTime date) { 
     this.date = date; 
    } 
} 

test.csv:

foo,bar,date 
asdf,fdsa,2017-07-20 04:15:25.0 
qwerty,ytrewq,2017-07-20 04:15:25.0 

Suis-je manque quelque chose?

+0

https://stackoverflow.com/questions/9059481/spring-batch-how-to-convert-string-from-file-to-date – Ben

+0

Copie possible de [Spring Batch - comment convertir une chaîne de fichier à date?] (Https://stackoverflow.com/questions/9059481/spring-batch-how-to-convert-string-from-file-to-date) – Ben

Répondre

2

Vous pouvez remplacer la méthode initBinder de BeanWrapperFieldSetMapper:

public class BeanWrapperFieldSetMapperCustom<T> extends BeanWrapperFieldSetMapper<T> { 

    @Override 
    protected void initBinder(DataBinder binder) { 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); 
     binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() { 
      @Override 
      public void setAsText(String text) throws IllegalArgumentException { 
       if (StringUtils.isNotEmpty(text)) { 
        setValue(LocalDate.parse(text, formatter)); 
       } else { 
        setValue(null); 
       } 
      } 

      @Override 
      public String getAsText() throws IllegalArgumentException { 
       Object date = getValue(); 
       if (date != null) { 
        return formatter.format((LocalDate) getValue()); 
       } else { 
        return ""; 
       } 
      } 
     }); 
    } 
} 
+0

C'est presque juste. J'ai dû utiliser 'LocalDateTime' au lieu de' LocalDate', et utiliser le modèle de date 'aaaa-MM-jj H: m: s.S' à la place. – badjr