Spring批次:输入资源不存在class路径资源
Spring batch: Input resource does not exist class path resource
我目前正在开发一个 Spring 批处理,它首先将 Excel (.xsls) 文件转换为 CSV,然后读取 CSV,对其进行处理并将其数据存储在数据库中。
第一步效果很好。批处理在第二步停止并抛出此警告:Input resource does not exist class path resource [C:/work/referentielAgenceCE.csv]
。在我的代码之后:
spring-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">
<!-- import config Spring générale -->
<import resource="classpath*:spring/***-batch-spring.xml" />
<bean id="pathFichier" class="java.lang.String">
<constructor-arg value="${batch.referentielAgenceCE.inputFilePathCSV}" />
</bean>
<batch:job id="simpleFileImportJob" xmlns="http://www.springframework.org/schema/batch">
<batch:step id="convertStep" next="processingStep">
<batch:tasklet ref="convert"/>
</batch:step>
<batch:step id="processingStep">
<batch:tasklet>
<batch:chunk reader="agenceCEReader" processor="agenceCEProcessor" writer="agenceCEWriter"
commit-interval="5" />
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="convert"
class="com.***.referentielAgenceCE.convertTasklet.convertXLSXtoCVS" />
<!-- Reader -->
<bean id="agenceCEReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="strict" value="false" />
<property name="resource" ref="pathFichier" />
<property name="linesToSkip" value="1" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";" />
<property name="names"
value="Date Création,Date Dernière modif.,Date Début Validité,Date Fin Validité,Caisse,Identifiant Agence,Libellé Agence,Type Agence,Libellé Type Agence,Téléphone,Fax,2EME Ligne Adresse,3EME Ligne Adresse,4EME Ligne Adresse,5EME Ligne Adresse,6EME Ligne Adresse,Pays,Ville,Identifiant Niv. 1,Type Niv. 1,Libellé Niv. 1,Identifiant Niv. 2,Type Niv. 2,Libellé Niv. 2,Identifiant Niv. 3,Type Niv. 3,Libellé Niv. 3,Identifiant Niv. 4,Type Niv. 4,Libellé Niv. 4,Identifiant Niv. 5,Type Niv. 5,Libellé Niv. 5,Identifiant Niv. 6,Type Niv. 6,Libellé Niv. 6,Identifiant Niv. 7,Type Niv. 7,Libellé Niv. 7,Identifiant Niv. 8,Type Niv. 8,Libellé Niv. 8,Identifiant Niv. 9,Type Niv. 9,Libellé Niv. 9,Identifiant Niv. 10,Type Niv. 10,Libellé Niv. 10,Identifiant Niv. 11,Type Niv. 11,Libellé Niv. 11,Identifiant Niv. 12,Type Niv. 12,Libellé Niv. 12,Identifiant Niv. 13,Type Niv. 13,Libellé Niv. 13,Identifiant Niv. 14,Type Niv. 14,Libellé Niv. 14,Jours/Heures Ouverture,Code Etat" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="com.***.referentielAgenceCE.mapping.AgenceCEFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<!-- Processor -->
<bean id="agenceCEProcessor"
class="com.***.referentielAgenceCE.processor.AgenceCEItemProcessor"/>
<!-- Writer -->
<bean id="agenceCEWriter"
class="com.***.referentielAgenceCE.writer.AgenceCEItemWriter" />
</beans>
第 1 步 - convertXLSXtoCVS.java:
public class convertXLSXtoCVS implements Tasklet, InitializingBean{
@Value("${batch.referentielAgenceCE.inputFilePathXLSX}")
private String inputFile;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
System.out.println("convertXLSXtoCVS.execute1");
// For storing data into CSV files
StringBuffer data = new StringBuffer();
try {
File outputFile = new File(getOutputFile(inputFile));
FileWriter fw = new FileWriter(outputFile.getPath());
BufferedWriter fos = new BufferedWriter(fw);
// Get the workbook object for XLSX file
XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(inputFile));
// Get first sheet from the workbook
XSSFSheet sheet = wBook.getSheetAt(0);
Row row;
Cell cell;
// Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
row = rowIterator.next();
// For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
data.append(cell.getBooleanCellValue() + ",");
break;
case Cell.CELL_TYPE_NUMERIC:
data.append(cell.getNumericCellValue() + ",");
break;
case Cell.CELL_TYPE_STRING:
data.append(cell.getStringCellValue() + ",");
break;
case Cell.CELL_TYPE_BLANK:
data.append("" + ",");
break;
default:
data.append(cell + ",");
}
}
}
fos.write(data.toString());
fos.close();
}catch (Exception ioe) {
ioe.printStackTrace();
}
return RepeatStatus.FINISHED;
}
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(inputFile, "inputFile must be set");
}
public String getOutputFile(String inputFile){
String[] parts = inputFile.split("\.");
return parts[0]+"."+parts[1].replace("xlsx", "csv");
}
}
我在属性文件中提到的文件路径如下:
batch.referentielAgenceCE.inputFilePathXLSX=C\:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C\:\work\referentielAgenceCE.csv
当我从 reader 定义中的 spring-config.xml 中删除时,出现以下错误:
org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:137)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy44.open(Unknown Source)
at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:93)
at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:301)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:192)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61)
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:144)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:120)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574)
Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file://work//referentielAgenceCE.csv]
at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:250)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:134)
... 27 more
正在看:
Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file://work//referentielAgenceCE.csv]
更准确地说:
file://work//referentielAgenceCE.csv
我认为你需要更换:
batch.referentielAgenceCE.inputFilePathXLSX=C\:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C\:\work\referentielAgenceCE.csv
来自
batch.referentielAgenceCE.inputFilePathXLSX=C:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C:\work\referentielAgenceCE.csv
我找到了解决方案。我应该将 'file:' 添加到输出 cvs 文件路径。所以它应该是这样的:
batch.referentielAgenceCE.inputFilePathCSV=file\:C\:\work\referentielAgenceCE.csv instead of C\:\work\referentielAgenceCE.csv
我目前正在开发一个 Spring 批处理,它首先将 Excel (.xsls) 文件转换为 CSV,然后读取 CSV,对其进行处理并将其数据存储在数据库中。
第一步效果很好。批处理在第二步停止并抛出此警告:Input resource does not exist class path resource [C:/work/referentielAgenceCE.csv]
。在我的代码之后:
spring-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd">
<!-- import config Spring générale -->
<import resource="classpath*:spring/***-batch-spring.xml" />
<bean id="pathFichier" class="java.lang.String">
<constructor-arg value="${batch.referentielAgenceCE.inputFilePathCSV}" />
</bean>
<batch:job id="simpleFileImportJob" xmlns="http://www.springframework.org/schema/batch">
<batch:step id="convertStep" next="processingStep">
<batch:tasklet ref="convert"/>
</batch:step>
<batch:step id="processingStep">
<batch:tasklet>
<batch:chunk reader="agenceCEReader" processor="agenceCEProcessor" writer="agenceCEWriter"
commit-interval="5" />
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="convert"
class="com.***.referentielAgenceCE.convertTasklet.convertXLSXtoCVS" />
<!-- Reader -->
<bean id="agenceCEReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="strict" value="false" />
<property name="resource" ref="pathFichier" />
<property name="linesToSkip" value="1" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";" />
<property name="names"
value="Date Création,Date Dernière modif.,Date Début Validité,Date Fin Validité,Caisse,Identifiant Agence,Libellé Agence,Type Agence,Libellé Type Agence,Téléphone,Fax,2EME Ligne Adresse,3EME Ligne Adresse,4EME Ligne Adresse,5EME Ligne Adresse,6EME Ligne Adresse,Pays,Ville,Identifiant Niv. 1,Type Niv. 1,Libellé Niv. 1,Identifiant Niv. 2,Type Niv. 2,Libellé Niv. 2,Identifiant Niv. 3,Type Niv. 3,Libellé Niv. 3,Identifiant Niv. 4,Type Niv. 4,Libellé Niv. 4,Identifiant Niv. 5,Type Niv. 5,Libellé Niv. 5,Identifiant Niv. 6,Type Niv. 6,Libellé Niv. 6,Identifiant Niv. 7,Type Niv. 7,Libellé Niv. 7,Identifiant Niv. 8,Type Niv. 8,Libellé Niv. 8,Identifiant Niv. 9,Type Niv. 9,Libellé Niv. 9,Identifiant Niv. 10,Type Niv. 10,Libellé Niv. 10,Identifiant Niv. 11,Type Niv. 11,Libellé Niv. 11,Identifiant Niv. 12,Type Niv. 12,Libellé Niv. 12,Identifiant Niv. 13,Type Niv. 13,Libellé Niv. 13,Identifiant Niv. 14,Type Niv. 14,Libellé Niv. 14,Jours/Heures Ouverture,Code Etat" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="com.***.referentielAgenceCE.mapping.AgenceCEFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<!-- Processor -->
<bean id="agenceCEProcessor"
class="com.***.referentielAgenceCE.processor.AgenceCEItemProcessor"/>
<!-- Writer -->
<bean id="agenceCEWriter"
class="com.***.referentielAgenceCE.writer.AgenceCEItemWriter" />
</beans>
第 1 步 - convertXLSXtoCVS.java:
public class convertXLSXtoCVS implements Tasklet, InitializingBean{
@Value("${batch.referentielAgenceCE.inputFilePathXLSX}")
private String inputFile;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
System.out.println("convertXLSXtoCVS.execute1");
// For storing data into CSV files
StringBuffer data = new StringBuffer();
try {
File outputFile = new File(getOutputFile(inputFile));
FileWriter fw = new FileWriter(outputFile.getPath());
BufferedWriter fos = new BufferedWriter(fw);
// Get the workbook object for XLSX file
XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(inputFile));
// Get first sheet from the workbook
XSSFSheet sheet = wBook.getSheetAt(0);
Row row;
Cell cell;
// Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
row = rowIterator.next();
// For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
data.append(cell.getBooleanCellValue() + ",");
break;
case Cell.CELL_TYPE_NUMERIC:
data.append(cell.getNumericCellValue() + ",");
break;
case Cell.CELL_TYPE_STRING:
data.append(cell.getStringCellValue() + ",");
break;
case Cell.CELL_TYPE_BLANK:
data.append("" + ",");
break;
default:
data.append(cell + ",");
}
}
}
fos.write(data.toString());
fos.close();
}catch (Exception ioe) {
ioe.printStackTrace();
}
return RepeatStatus.FINISHED;
}
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(inputFile, "inputFile must be set");
}
public String getOutputFile(String inputFile){
String[] parts = inputFile.split("\.");
return parts[0]+"."+parts[1].replace("xlsx", "csv");
}
}
我在属性文件中提到的文件路径如下:
batch.referentielAgenceCE.inputFilePathXLSX=C\:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C\:\work\referentielAgenceCE.csv
当我从 reader 定义中的 spring-config.xml 中删除时,出现以下错误:
org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:137)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy44.open(Unknown Source)
at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:93)
at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:301)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:192)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61)
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:144)
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124)
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:120)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349)
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574)
Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file://work//referentielAgenceCE.csv]
at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:250)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:134)
... 27 more
正在看:
Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file://work//referentielAgenceCE.csv]
更准确地说:
file://work//referentielAgenceCE.csv
我认为你需要更换:
batch.referentielAgenceCE.inputFilePathXLSX=C\:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C\:\work\referentielAgenceCE.csv
来自
batch.referentielAgenceCE.inputFilePathXLSX=C:\work\referentielAgenceCE.xlsx
batch.referentielAgenceCE.inputFilePathCSV=C:\work\referentielAgenceCE.csv
我找到了解决方案。我应该将 'file:' 添加到输出 cvs 文件路径。所以它应该是这样的:
batch.referentielAgenceCE.inputFilePathCSV=file\:C\:\work\referentielAgenceCE.csv instead of C\:\work\referentielAgenceCE.csv