我有一个springboot命令行应用程序,其中生产命令行args之一是绝对基本路径。在此示例中,我们将其称为
“ / var / batch /”
我正在我的production.yml文件中设置基本路径,并使用默认值。
公司: basePath:$ {basePath:/ var / default /}
然后,我有了一个ApplicationConfig.java文件,该文件使用该基本路径来创建一堆类似的文件路径。
@ConfigurationProperties(prefix = "company")
public class ApplicationConfig {
private String basePath;
public String getPrimaryCarePath() {
return basePath + "ADAP-2-PCProv.dat";
}
public String getPrimaryCareDetailPath() {
return basePath + "ADAP-2-" + getBatchNo() + ".det";
}
... additional files.
}
最后,文件路径像这样传递到我的CSS解析器中。
public List<T> readCsv() throws IOException {
try (BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(filePath))) {
return new CsvToBeanBuilder(bufferedReader)
.withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
.withType(subClass)
.withSeparator('\t')
.withIgnoreLeadingWhiteSpace(true)
.build().parse();
}
}
现在,一切在生产中都可以正常工作,但是在尝试进行突变测试时,我们会遇到一些问题。似乎csv解析器正在寻找绝对路径而不是相对路径。我们的application-test.yml文件中具有以下路径。
company:
basePath: src/test/resources/
我们所有的测试文件都存储在测试资源包中,所以我的问题是我们如何使用相对路径来填充ApplicationConfig.java文件的测试资源,同时仍然能够使用绝对路径进行生产?我当时想我可以使用ClassPathResource通过测试设置覆盖基本路径,但想知道是否有更好的方法。
答案 0 :(得分:1)
您需要两种类型的配置:一种用于资源,另一种用于绝对路径。
我建议添加一个值为app.file.path.type
和resources
的新属性absolute
。您可以定义一个名为FileProvider
的新接口。
public interface FilePathProvider(){
Path getFilePath();
}
您可以使用@ConditionalOnProperty
定义2个不同的bean并设置文件路径策略:
@Configuration
public class ApplicationConfig{
@Bean
@ConditionalOnProperty(
name = "app.file.path.type",
havingValue = "absolute")
public FilePathProvider absoluteFilePathProvider(ApplicationConfig applicationConfig){
return () -> Paths.get(applicationConfig.getBasePath());
}
@ConditionalOnProperty(
name = "app.file.path.type",
havingValue = "resources")
@Bean
public FilePathProvider resourceFilePathProvider(ApplicationConfig applicationConfig){
return () -> Paths.get(this.getClass().getClassLoader().getResource(applicationConfig.getBasePath()).getPath());
}
}
在开发和测试模式下,您将拥有app.file.path.type=resources
,在生产中,您将拥有app.file.path.type=absolute
。
这种方法的优点是,您还可以在开发中将属性设置为absolute
。