java – 使用Spring Batch将日期从文件解析为LocalDateTime
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Spring Batch将日期从文件解析为LocalDateTime,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4030字,纯文字阅读大概需要6分钟。
内容图文
![java – 使用Spring Batch将日期从文件解析为LocalDateTime](/upload/InfoBanner/zyjiaocheng/746/7e930c1a81304180803688b84b77d888.jpg)
我正在尝试使用Spring Batch读取带有日期的CSV文件,但是我无法将日期解析为LocalDateTime对象:
Field error in object ‘target’ on field ‘date’: rejected value [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 []; default message [date]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.time.LocalDateTime’ for property ‘date’; nested exception is java.lang.IllegalStateException: Cannot convert value of type ‘java.lang.String’ to required type ‘java.time.LocalDateTime’ for property ‘date’: no matching editors or conversion strategy found]
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 – 使用Spring Batch将日期从文件解析为LocalDateTime全部内容,希望文章能够帮你解决java – 使用Spring Batch将日期从文件解析为LocalDateTime所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。