Spring批处理:输入资源不存在类路径资源

我目前正在开发一个弹簧批处理,它在第一步将Excel(.xsls)文件转换为CVS,然后读取CVS处理它并将其数据存储在数据库中。 第一步效果很好。 批处理停止在第二步抛出此警告:输入资源不存在类路径资源[C:/work/referentielAgenceCE.csv]。 在我的代码之后:

spring-config.xml:

                                          

step1: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 rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { row = rowIterator.next(); // For each row, iterate through each columns Iterator 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 

当我从阅读器定义中的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$1.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 

我找到了解决方案。 我应该将’file:’添加到输出cvs文件路径中。 所以它应该是这样的:batch.referentielAgenceCE.inputFilePathCSV = file:C:\ work \ referentielAgenceCE.csv而不是C:\ work \ referentielAgenceCE.csv

看到:

 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