Spring启动批MultiResourceItemReader:如何使用@Value()从jar位置读取文件



我试图使用@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]

不确定是否有其他方法来设置MultiResourceItemReader的资源,除了@Value注释。帮助将是非常感激的!

编辑:-这是一个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。按照Mahmoud Ben Hassine的建议做了一个干净的构建和更新@Value("file:/input/userdata*.csv")

当我将输入文件夹放在jar

的同一目录中时,它不拾取

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

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

编辑:你可以在这里找到一个完整的例子。

相关内容

  • 没有找到相关文章

最新更新