java – 使用Spring Batch将日期从文件解析为LocalDateTime
我正在尝试使用
Spring Batch读取带有日期的CSV文件,但是我无法将日期解析为LocalDateTime对象:
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 我错过了什么吗? 解决方法
您可以覆盖BeanWrapperFieldSetMapper< T>的方法initBinder:
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) date); } else { return ""; } } }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 在ZonedDateTime或Instant中将小时分和秒
- java – 如何使用通配符迭代此通用列表?
- Java ExecutorService invokeAll()中断
- java – 这个clone()有什么问题?
- java – org.hibernate.PersistentObjectExcepti
- java – 预编译JDBC PreparedStatement是什么?
- exchanger java另一种栅栏
- Spring3.1.1+MyBatis3.1.1的增、删、查、改以及分
- java – android spinner NullPointerException
- java – 将for循环转换为一个lambda表达式的conc