我正试图用Spring批处理读取带有日期的CSV文件,但在将日期解析为LocalDateTime
对象时遇到了麻烦:
对象“target”中字段“date”出现字段错误:拒绝值[2017-07-20 04:15:25.0];代码[TypeMismatch.target.date,TypeMismatch.date,TypeMismatch.java.time.LocalDateTime,TypeMismatch];参数[org.springframework.context.support.defaultmessageSourceResolvable:代码[target.date,date];参数[];default message[date]];默认消息[无法将“java.lang.String”类型的属性值转换为属性“date”的必需类型“java.time.LocalDateTime”;嵌套异常为java.lang.IllegalStateException:无法将“java.lang.String”类型的值转换为属性“date”的必需类型“java.time.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;
}
}
foo,bar,date
asdf,fdsa,2017-07-20 04:15:25.0
qwerty,ytrewq,2017-07-20 04:15:25.0
我是不是漏掉了什么?
可以重写BeanWrapperFieldSetMapper
的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 "";
}
}
});
}
}
我如何在ItemReader中使用Univocity一次读取一行,仍然使用BeanProcessor将我的行自动解析为Java对象?
目的-解密一个.PGP加密的文件,读取数据作为流,执行转换到供应商的要求,加密作为流和写入一个文件。 逻辑-自定义读取器、写入器和任务程序,将解密/加密的数据存储到ExecutionContext并传递到不同的步骤。 适用于-小文件(~1MB) 面临问题-尝试使用(~10MB-10K记录)-读取步骤成功,但当开始将数据作为加密文件写入时-内存问题-Java.lang.OutOfMemoryErro
本文向大家介绍Spring Batch批处理框架使用解析,包括了Spring Batch批处理框架使用解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Batch批处理框架使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算。 现在
我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。
我试图验证输入文件是否为空或有数据。我正在使用Spring批处理通过XML bean配置,我的实际配置如下: 在我的课堂上,我有这样的东西: 但它从未进入“else”声明,它只是结束了这个过程。 有人知道是否有其他方法来验证文件是否为空吗?
需要读取spring批处理中的文件,对其进行处理并将其作为一个提要保存。一个提要包含50%的信息。当我必须持久化提要的最终结果时,我需要使用公共字段将它们组合起来,并像一个项目一样持久化。请参见下面的示例。 我需要保留的最终信息如下: 请建议我如何在我的Spring批工作中实现这一点。 谢谢