Java org.springframework.batch.item.file.FlatFileParseException:
错误Java org.springframework.batch.item.file.FlatFileParseException:,java,spring,batch-processing,Java,Spring,Batch Processing,错误 Parsing error at line: 1 in resource=[file [C:\Users\satish_pahuja\Desktop\BO_Office_Acc_Ext.txt]], input=[BOOfficeAccExt,B0001,00006746464646,S0001,BA0001,A,ABC,XYZ,UID,SatishPahuja,SatishPahuja,090909,151512] at org.springframework.batch.ite
Parsing error at line: 1 in resource=[file [C:\Users\satish_pahuja\Desktop\BO_Office_Acc_Ext.txt]], input=[BOOfficeAccExt,B0001,00006746464646,S0001,BA0001,A,ABC,XYZ,UID,SatishPahuja,SatishPahuja,090909,151512]
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:183)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
at gov.in.dop.rsi.mgnregs.batch.FileBatchReader.read(FileBatchReader.java:38)
at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155)
at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:108)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:127)
at gov.in.dop.rsi.mgnregs.batch.BatchProcessExtract.main(BatchProcessExtract.java:29)
Caused by: java.lang.NullPointerException
at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.getBean(BeanWrapperFieldSetMapper.java:230)
at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.mapFieldSet(BeanWrapperFieldSetMapper.java:185)
at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:43)
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:180)
... 30 more
Sep 15, 2015 3:04:54 PM org.springframework.batch.core.launch.support.SimpleJobLauncher$1 run
INFO: Job: [FlowJob: [name=batchExtracts]] completed with the following parameters: [{}] and the following status: [FAILED]
Exit Status : FAILED
Done
job report.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:orcl="http://www.springframework.org/schema/data/orcl"
xsi:schemaLocation="http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/orcl
http://www.springframework.org/schema/data/orcl/spring-data-orcl-1.0.xsd">
<batch:job id="batchExtracts">
<batch:step id="step1">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="cvsFileItemReader" writer="csvFileItemWriter"
processor="csvFileItemProcessor" commit-interval="20" />
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="cvsFileItemReader" class="gov.in.dop.rsi.mgnregs.batch.FileBatchReader">
</bean>
<bean id="csvFileItemProcessor" class="gov.in.dop.rsi.mgnregs.batch.FileBatchProcessor">
</bean>
<bean id="csvFileItemWriter" class="gov.in.dop.rsi.mgnregs.batch.FileBatchWriter">
</bean>
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- stored job-meta in database -->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager" />
</bean>
<!-- stored job-meta in memory -->
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans>
我遇到了这个错误,并尝试了很多方法,比如在txt文件中删除值之间的空格,在所有值中添加双倒逗号。请帮我做这个
package gov.in.dop.rsi.mgnregs.batch;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.core.io.FileSystemResource;
public class FileBatchReader<BoOfficeAccExtract> implements ItemReader {
public BoOfficeAccExtract read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
System.out.println("Inside read method-0-");
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames(new String[] {"extFileName","boId","officeAccountNo","solId" ,"bankId","ind","freeField1","freeField2","freeField3","modifiedBy","createdBy","modifiedDate","createdDate"});
BeanWrapperFieldSetMapper<BoOfficeAccExtract> fieldSetMapper = new BeanWrapperFieldSetMapper<BoOfficeAccExtract>();
fieldSetMapper.setPrototypeBeanName("BoOfficeAccExtract");
DefaultLineMapper<BoOfficeAccExtract> lineMapper = new DefaultLineMapper<BoOfficeAccExtract>();
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
FlatFileItemReader<BoOfficeAccExtract> reader = new FlatFileItemReader<BoOfficeAccExtract>();
reader.setResource(new FileSystemResource("C:\\Users\\satish_pahuja\\Desktop\\BO_Office_Acc_Ext.txt"));
reader.setLineMapper(lineMapper);
reader.open(new ExecutionContext());
BoOfficeAccExtract boOfficAccExtract=reader.read();
return boOfficAccExtract;
}
}
package.gov.in.dop.rsi.mgnregs.batch;
导入org.springframework.batch.item.ExecutionContext;
导入org.springframework.batch.item.ItemReader;
导入org.springframework.batch.item.NonTransientResourceException;
导入org.springframework.batch.item.ParseException;
导入org.springframework.batch.item.UnexpectedInputException;
导入org.springframework.batch.item.file.FlatFileItemReader;
导入org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
导入org.springframework.batch.item.file.mapping.DefaultLineMapper;
导入org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
导入org.springframework.core.io.FileSystemResource;
公共类FileBatchReader实现ItemReader{
public BoOfficeAccExtract read()引发异常,未预料的PutException,
ParseException,非TransientResourceException{
System.out.println(“内部读取方法-0-”;
DelimitedLineTokenizer lineTokenizer=新的DelimitedLineTokenizer();
lineTokenizer.setNames(新字符串[]{“extFileName”、“boId”、“officeAccountNo”、“solId”、“bankId”、“ind”、“freeField1”、“freeField2”、“freeField3”、“modifiedBy”、“createdBy”、“modifiedDate”、“createdDate”});
BeanRapperFieldSetMapper=新的BeanRapperFieldSetMapper();
fieldSetMapper.setPrototypeBeanName(“BoOfficeAccExtract”);
DefaultLineMapper lineMapper=新的DefaultLineMapper();
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(“C:\\Users\\satish\u pahuja\\Desktop\\BO\u Office\u Acc\u Ext.txt”);
reader.setLineMapper(lineMapper);
reader.open(新的ExecutionContext());
BoOfficeAccExtract boofficextract=reader.read();
返回boofficextract;
}
}
对于初学者来说,放下你那丑陋的阅读器,每次调用read()
,你都在一遍又一遍地读同一行。只需使用配置,而不是包装读卡器的读卡器
这也是因为beanwrapperfiedsetmapper
需要BeanFactory
(它实现了BeanFactoryAware
,但由于您的设置从未被调用
基本上,删除您的读卡器,只需在XML中配置它。用以下内容替换cvsFileItemReader
bean定义(修复我没有包含的包)
或者您可以使用基于Java的配置而不是XML
@Configuration
public class CsvJobConfiguration {
@Bean
public FlatFileItemReader cvsFileItemReader() {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource("C:\\Users\\satish_pahuja\\Desktop\\BO_Office_Acc_Ext.txt"));
reader.setLineMapper(csvLineMapper());
return reader;
}
@Bean
public LineMapper<BoOfficeAccExtract> csvLineMapper() {
DefaultLineMapper<BoOfficeAccExtract> lineMapper = new DefaultLineMapper<BoOfficeAccExtract>();
lineMapper.setLineTokenizer(csvLineTokenizer());
lineMapper.setFieldSetMapper(csvFieldSetMapper());
return lineMapper;
}
@Bean
public LineTokenizer csvLineTokenizer() {
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames(new String[] {"extFileName","boId","officeAccountNo","solId" ,"bankId","ind","freeField1","freeField2","freeField3","modifiedBy","createdBy","modifiedDate","createdDate"});
return lineTokenizer;
}
@Bean
public FieldSetMapper csvFieldSetMapper() {
BeanWrapperFieldSetMapper<BoOfficeAccExtract> fieldSetMapper = new BeanWrapperFieldSetMapper<BoOfficeAccExtract>();
fieldSetMapper.setPrototypeBeanName("BoOfficeAccExtract");
return fieldSetMapper;
}
}
@配置
公共类CsvJobConfiguration{
@豆子
公共FlatFileItemReader cvsFileItemReader(){
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(“C:\\Users\\satish\u pahuja\\Desktop\\BO\u Office\u Acc\u Ext.txt”);
setLineMapper(csvLineMapper());
返回读取器;
}
@豆子
公共测线器csvLineMapper(){
DefaultLineMapper lineMapper=新的DefaultLineMapper();
setLineTokenizer(csvLineTokenizer());
setFieldSetMapper(csvFieldSetMapper());
返回线映射器;
}
@豆子
公共行标记器csvLineTokenizer(){
DelimitedLineTokenizer lineTokenizer=新的DelimitedLineTokenizer();
lineTokenizer.setNames(新字符串[]{“extFileName”、“boId”、“officeAccountNo”、“solId”、“bankId”、“ind”、“freeField1”、“freeField2”、“freeField3”、“modifiedBy”、“createdBy”、“modifiedDate”、“createdDate”});
返回线标记器;
}
@豆子
公共字段集映射器csvFieldSetMapper(){
BeanRapperFieldSetMapper=新的BeanRapperFieldSetMapper();
fieldSetMapper.setPrototypeBeanName(“BoOfficeAccExtract”);
返回字段集映射器;
}
}
BoOfficeAccExtract是一个简单的POJO类。请描述一下你的代码应该做什么。没有名为BoOfficeAccExtract的bean,
而且你的配置/读卡器坏了……你到底为什么要用读卡器包装一个reder,每次调用都要重新打开它?Wy不仅仅是把它放在配置中?我必须使用spri实现代码ng批处理将从txt文件中读取信息,该文件将具有逗号分隔的值并写入数据库。但我在仅读取时收到错误。不,您不知道。我强烈建议您阅读Spring批处理文档,了解它的工作原理和作用。您的代码是问题所在,编写代码是因为您不知道了解框架的工作原理。我真的希望您的处理器和写入程序不一样,因为这会导致问题。如果我想使用customReader类而不是基于xml的配置,那么解决方案是什么。@Deinum请查找上面更新的读卡器类,但仍然无法工作。将来我必须从FTP服务器和如果我只使用基于xml的配置,那怎么可能呢?xml或java配置无关紧要。你的阅读器有缺陷,它不会工作。如果你想要FTP,我强烈建议将Spring集成与Spring批处理结合起来(用于本地系统上的文件轮询或远程轮询)这将使它完全透明。基本上资源来自哪里并不重要。
package gov.in.dop.rsi.mgnregs.batch;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.core.io.FileSystemResource;
public class FileBatchReader<BoOfficeAccExtract> implements ItemReader {
public BoOfficeAccExtract read() throws Exception, UnexpectedInputException,
ParseException, NonTransientResourceException {
System.out.println("Inside read method-0-");
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames(new String[] {"extFileName","boId","officeAccountNo","solId" ,"bankId","ind","freeField1","freeField2","freeField3","modifiedBy","createdBy","modifiedDate","createdDate"});
BeanWrapperFieldSetMapper<BoOfficeAccExtract> fieldSetMapper = new BeanWrapperFieldSetMapper<BoOfficeAccExtract>();
fieldSetMapper.setPrototypeBeanName("BoOfficeAccExtract");
DefaultLineMapper<BoOfficeAccExtract> lineMapper = new DefaultLineMapper<BoOfficeAccExtract>();
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
FlatFileItemReader<BoOfficeAccExtract> reader = new FlatFileItemReader<BoOfficeAccExtract>();
reader.setResource(new FileSystemResource("C:\\Users\\satish_pahuja\\Desktop\\BO_Office_Acc_Ext.txt"));
reader.setLineMapper(lineMapper);
reader.open(new ExecutionContext());
BoOfficeAccExtract boOfficAccExtract=reader.read();
return boOfficAccExtract;
}
}
<bean id="cvsFileItemReader" class="FlatFileItemReader">
<property name="resource" value="C:\\Users\\satish_pahuja\\Desktop\\BO_Office_Acc_Ext.txt" />
<property name="lineMapper">
<bean class="DefaultLineMapper">
<property name="lineTokenizer">
<bean class="DelimitedLineTokenizer">
<property name="names" value="extFileName,boId,officeAccountNo,solId,bankId,ind,freeField1,freeField2,freeField3,modifiedBy,createdBy,modifiedDate,createdDate" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="BoOfficeAccExtract" />
</bean>
</property>
</bean>
</property>
</bean>
@Configuration
public class CsvJobConfiguration {
@Bean
public FlatFileItemReader cvsFileItemReader() {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource("C:\\Users\\satish_pahuja\\Desktop\\BO_Office_Acc_Ext.txt"));
reader.setLineMapper(csvLineMapper());
return reader;
}
@Bean
public LineMapper<BoOfficeAccExtract> csvLineMapper() {
DefaultLineMapper<BoOfficeAccExtract> lineMapper = new DefaultLineMapper<BoOfficeAccExtract>();
lineMapper.setLineTokenizer(csvLineTokenizer());
lineMapper.setFieldSetMapper(csvFieldSetMapper());
return lineMapper;
}
@Bean
public LineTokenizer csvLineTokenizer() {
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setNames(new String[] {"extFileName","boId","officeAccountNo","solId" ,"bankId","ind","freeField1","freeField2","freeField3","modifiedBy","createdBy","modifiedDate","createdDate"});
return lineTokenizer;
}
@Bean
public FieldSetMapper csvFieldSetMapper() {
BeanWrapperFieldSetMapper<BoOfficeAccExtract> fieldSetMapper = new BeanWrapperFieldSetMapper<BoOfficeAccExtract>();
fieldSetMapper.setPrototypeBeanName("BoOfficeAccExtract");
return fieldSetMapper;
}
}