Spring批输入资源必须存在(读者处于'严格'模式)错误

时间:2017-09-25 10:37:22

标签: java spring spring-batch

我使用Spring Batch来解析csv文件。它在资源目录中的文件时很有用,但在其他地方不起作用。我搞错了

.*

我的代码

(r"/static/(.*)", tornado.web.StaticFileHandler,{'path': 'static'})

但是这段代码很好用

Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): class path resource [c:/data/geodata1.csv]

4 个答案:

答案 0 :(得分:2)

使用 org.springframework.core.io 中的 PathResource ,它对我有用

@Bean
@StepScope
public FlatFileItemReader<CourseCountry> reader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile) {
    return new FlatFileItemReaderBuilder<CourseCountry>()
      .name("studentItemReader")        
      .resource(new PathResource(pathToFile))
      .lineMapper(lineMapper())
      .linesToSkip(1)
      .build();
}

答案 1 :(得分:1)

我发现了同样的问题,并且我使用org.springframework.core.io.FileSystemResource类,如下所示: file:c:\ data \ geodata1.csv reader.setResource(new FileSystemResource(file));

答案 2 :(得分:0)

刚发现解决方案使用的是org.springframework.core.io.UrlResource;类,而不是org.springframework.core.io.ClassPathResource;

答案 3 :(得分:0)

方案一:你可以使用PathResource如下

@Bean
public FlatFileItemReader<Person> reader() {
   new FlatFileItemReaderBuilder<Person>()
                .name("JobName")
                .resource(new PathResource(getReceivedFilePath("Location")))
                .targetType("Targetclass".class)
                .linesToSkip(" count of no of lines to skip")
                .delimited()
                .delimiter(recordSeparator)
                .includedFields(new Integer[] { 0, 1})
                .names(new String[] { "param1 in target class","param2 in target class etc" })
                .build();
}

你传递给 PathResource 的 getReceivedFilePath 应该如下,它接受任何以 etc 开头或结尾的文件

 public String getReceivedFilePath(String fileName) {

        File directory = new File(file.location);
        if (directory.isDirectory()) {
            File[] files = directory.listFiles((dir, name) -> name.toLowerCase().endsWith("extension.type"));
            for (File file : files) {
                if (FilenameUtils.getBaseName(file.getName()).startsWith(FilenameUtils.getBaseName(fileName))) {
                    return file.getAbsolutePath();
                }
            }
        }
        return directory.getName();
    }

解决方案 2:您可以使用 PathResource,但您的文件名应与您提供的确切路径相匹配

例如:new PathResource("C:\files\filename.csv")