我想拥有属性,我可以在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}"
答案 0 :(得分:22)
Spring可以组合属性
myDir=/path/to/mydir
myFile=${myDir}/myfile.txt
您还可以使用默认值,而不首先在属性中定义myFile
:
属性文件
myDir=/path/to/mydir
课堂上:
@Value("#{myFile:${myDir}/myfile.txt}")
private String myFileName;