依赖于其他属性的Spring属性

时间:2016-03-21 16:41:55

标签: java spring

我想拥有属性,我可以在spring bean中通过@Value引用,只能依赖于其他属性来创建。 特别是我有一个属性,它描述了目录的文件系统位置。

myDir=/path/to/mydir

按照惯例,该目录中有一个文件,总是被称为 myfile.txt

现在我希望通过我的bean里面的@Value注释来访问目录和文件。有时候我想把它们作为字符串访问,有时候作为java.io.Files访问,有时候作为org.springframework.core.io.FileSystemResource(顺便提一下,它开箱即用!)。但是因为串联串联不是一种选择。

所以我当然可以做的就是宣布两者,但最终会以

结束
myDir=/path/to/mydir
myFile/path/to/mydir/myfile.txt

我想避免这种情况。

所以我提出了一个@Configuration类,它接受属性并将其添加为新的PropertySource:

@Autowired
private ConfigurableEnvironment environment;

@Value("${myDir}")
private void addCompleteFilenameAsProperty(Path myDir) {
    Path absoluteFilePath = myDir.resolve("myfile.txt");

    Map<String, Object> props = new HashMap<>();
    props.put("myFile, absoluteFilePath.toString());
    environment.getPropertySources().addFirst(new MapPropertySource("additional", props));
}

正如您所看到的,在我的上下文中,我甚至创建了一个PropertyEditor,它可以转换为 java.nio.file.Path

现在的问题是,由于某些原因,这个&#34;适用于我的机器&#34; (在我的IDE中),但不在预期的目标环境中运行。我得到了

java.lang.IllegalArgumentException: Could not resolve placeholder 'myFile' in string value "${myFile}"

1 个答案:

答案 0 :(得分:22)

Spring可以组合属性

myDir=/path/to/mydir 
myFile=${myDir}/myfile.txt

您还可以使用默认值,而不首先在属性中定义myFile

属性文件

myDir=/path/to/mydir

课堂上:

@Value("#{myFile:${myDir}/myfile.txt}")
private String myFileName;