【问题标题】:Spring boot batch MultiResourceItemReader: how to read files using @Value() from jar locationSpring Boot批处理MultiResourceItemReader:如何使用@Value()从jar位置读取文件
【发布时间】:2021-05-09 07:29:42
【问题描述】:

我正在尝试使用 @Value 注释获取输入文件并将其设置为 MultiResourceItemReader 的资源数组,如下所示;

@Value("classpath*:/input/userdata*.csv")
private Resource[] inputFiles;

当我将输入文件文件夹放在资源文件夹中时,它在 IDE 中工作正常。问题是当我运行 jar 文件时。如果文件在 IDE 中的 jar 中,它也可以正常工作。但是当我将输入文件夹放在 jar 文件的同一目录中时,它并没有出现。这是我的配置;

        @Value("classpath*:/input/userdata*.csv")
        private Resource[] inputFiles;
        
        @Bean
        public MultiResourceItemReader<UserInfo> multiResourceItemreader() {
            MultiResourceItemReader<UserInfo> reader = new MultiResourceItemReader<>();
            reader.setDelegate(userDataItemReader());
            reader.setResources(inputFiles);
            return reader;
        }

它没有给出任何错误,只是控制台中的以下消息

2021-02-04 16:31:42.959  WARN 15772 --- [           main] o.s.b.item.file.MultiResourceItemReader  : No resources to read. Set strict=true if this should be an error condition.

我不确定我在这里缺少什么。尝试在 @Value 中不使用类路径前缀,但它给了我以下异常

java.lang.IllegalArgumentException: Could not resolve resource location pattern [/input/userdata*.csv]

不确定除了@Value 注解之外还有其他方法可以为 MultiResourceItemReader 设置资源。非常感谢您的帮助!

编辑:- 这是一个 Spring Boot 批处理应用程序,这里是目录结构

            apps
            ├── input
            │   ├── userdata6.csv
            │   ├── userdata7.csv
            │   ├── userdata8.csv
            │   └── userdata9.csv
            └── multisource-batch.jar

我从同一个应用程序目录运行如下 jar 文件

java -jar multisource-batch.jar

build.gradle

        plugins {
          id 'org.springframework.boot' version '2.4.2'
          id 'io.spring.dependency-management' version '1.0.11.RELEASE'
          id 'java'
        }

        group = 'com.thomsoncodes.batch'
        version = '0.0.1-SNAPSHOT'
        sourceCompatibility = '1.8'

        repositories {
            mavenCentral()
            maven { url 'https://repo.spring.io/milestone' }
        }

        ext {
            set('springCloudVersion', "2020.0.0")
        }

        dependencies {
            implementation 'org.springframework.boot:spring-boot-starter-batch'
            runtimeOnly 'mysql:mysql-connector-java'
            testImplementation 'org.springframework.boot:spring-boot-starter-test'
            testImplementation 'org.springframework.batch:spring-batch-test'
            
            implementation 'org.projectlombok:lombok:1.18.2'
        }

        dependencyManagement {
            imports {
                mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            }
        }

        test {
            useJUnitPlatform()
        }

更新:- 最后我得到了它的工作!即使我删除了 Web 依赖项,spring 仍然认为这是 web.xml 。按照 Mahmoud Ben Hassine 的建议,进行了干净的构建并更新了 @Value("file:/input/userdata*.csv")!

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    当我将输入文件夹放在jar的同一目录中时,它没有出现

    如果您使用java -jar myapp.jar 运行您的应用程序,其中input 目录与myapp.jar 位于同一目录中,那么您需要使用file: 前缀而不是classpath: 前缀。

    @Value("file:input/userdata*.csv") 应该可以工作,因为它会从您启动 JVM 的相对目录中解析资源。

    编辑:你可以找到一个完整的例子here

    【讨论】:

    • 我尝试过,但出现错误 - 原因:java.lang.IllegalArgumentException:无法解析资源位置模式 [input/userdata*.csv]:无法解析 ServletContext 资源 [/input/]到 URL,因为它不存在
    • ServletContext resource..:看起来你的应用是一个网络应用,你应该在你的问题中提到这一点。请编辑您的问题并布局您的目录结构以及您运行应用的方式,以便能够以有效的方式为您提供帮助。
    • 它应该可以工作。你没有提到你如何运行你的应用程序。您是否使用apps 目录中的java -jar multisource-batch.jar 运行它?您的应用程序是 Web 应用程序吗?如果是,是否需要这样做,或者将您的工作打包到自己的非 webapp jar 中?
    • 首先非常感谢您的帮助。是的,它从应用程序目录运行并按照您提到的那样运行。我对 Web 应用程序部分有点困惑。它是一个 Spring Boot Batch 应用程序,我没有任何其他依赖项。也会更新 build.gradle。我使用 gradle build 来构建 jar
    • 感谢您的更新。为了提高效率,应该从一开始就在问题中添加这些细节,请参阅stackoverflow.com/help/minimal-reproducible-example。在这种情况下,您需要使用 file: 前缀而不是 classpath: 前缀。我相应地更新了问题并添加了指向完整示例的链接。如果您在错误消息中看到 ServletContext resource ...,这意味着您已解决 Web 依赖关系并且您的应用程序正在作为 Web 应用程序运行(Spring Boot 正在以某种方式自动配置 servlet 容器)。
    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2021-12-15
    • 1970-01-01
    • 2014-02-28
    • 2015-10-27
    • 2017-12-14
    相关资源
    最近更新 更多