2016-03-21 105 views
7

我想要通過@Value在Spring bean中引用的屬性,只能創建依賴於其他屬性的屬性。 特別是我有一個屬性,它描述了一個目錄的文件系統位置。取決於其他屬性的彈簧屬性

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)); 
} 

正如你所看到的,在我的方面,我甚至創造了一個屬性編輯器,可以轉換成java.nio.file.Path s。

現在的問題是,由於某種原因,這個「在我的機器上工作」(在我的IDE),但不能在預期的目標環境上運行。在那裏,我得到

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

你可能會把'$ {myDir}'放在屬性文件中(值得一試IMHO) – 2016-03-21 17:17:00

+0

或者使用'myFile = myfile.txt'並且以後使用'@Value(「$ {myDir}/$ { myFile}「)' – 2016-03-21 17:22:38

回答

7

Spring可以組合屬性

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

你也不能定義myFile在性能和以後使用默認值:

屬性文件

myDir=/path/to/mydir 

同組內容:

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

謝謝Sylvian!我已經有了這個解決方案,但是我錯過了在文件中定義組合的想法。 – realsim