2015-04-28 80 views
3

我的屬性文件中有內容如下如何使用@ConfigurationProperties加載名稱Value屬性在Spring

config.entry [0] = X-FRAME-OPTIONS,SAMEORIGIN

config.entry [ 1] =內容安全,政策,框架老祖「自我」

我想這是加載到配置類在那裏我可以加載一個集合中的關鍵,值對逗號分隔值。在Spring 3中如何使用@ConfigurationProperties來實現這一點?

條目= config.getEntry()應該給我一個集合,這樣我可以遍歷並獲得

for(Entry<String,String> index : config.getEntry().entryset()) { 
      index.getKey(); // Should Give - X-FRAME-OPTIONS 
      index.getValue(); // Should Give - SAMEORIGIN 
} 

我應該如何定義我的配置類,將在屬性文件中定義的名稱值對的列表以這種方式自動裝配屬性文件中的值?

以下實現拋出Spring異常對於屬性'entry [0]',無法將[java.lang.String]類型的值轉換爲所需的類型[java.util.Map]「:沒有匹配的編輯器或發現轉換策略]

@Component 
@ConfigurationProperties("config") 
public class MyConfiguration { 

    private Map<String,Map<String,String>> entry = new LinkedHashMap<String,Map<String,String>>(); 

    //getter for entry 

    //setter for entry 
} 
+0

能有對抗一個鍵多個值? – Braj

+0

不可以,每個鍵只能有一個值。我已經用我目前的方法和現在的確切錯誤更新了這個問題。 – yathirigan

回答

1

您可以用這種方式有可能做到這一點的兩個部分,一是簡單@ConfigurationProperties本身。接下來你想要做的不是本地的Spring - 你希望逗號分隔列表中的第一個字段是地圖中的一個鍵,這是一個自定義邏輯,你可以用這種方式使用邏輯來處理這個邏輯,看看如何我仍在使用Spring的conversionService改造逗號分隔StringList<String>

import javax.annotation.PostConstruct; 
import java.util.Collection; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
@ConfigurationProperties(prefix = "config") 
@Component 
public class SampleConfigProperties { 

    @Autowired 
    private ConversionService conversionService; 
    private List<String> entry; 

    private Map<String, String> entriesMap; 


    public List<String> getEntry() { 
     return entry; 
    } 

    public void setEntry(List<String> entry) { 
     this.entry = entry; 
    } 

    public Map<String, String> getEntriesMap() { 
     return entriesMap; 
    } 

    public void setEntriesMap(Map<String, String> entriesMap) { 
     this.entriesMap = entriesMap; 
    } 

    @PostConstruct 
    public void postConstruct() { 
     Map<String, String> entriesMap = new HashMap<>(); 
     for (String anEntry: entry) { 
      List<String> l = conversionService.convert(anEntry, List.class); 
      entriesMap.put(l.get(0), l.get(1)); 
     } 
     this.entriesMap = entriesMap; 
    } 

} 
+0

這是一個新的事情要知道..謝謝 – yathirigan

+0

需要額外的幫助。>>列表 l <<正在創建一個字符串列表時,字符串與昏迷(,)分離。無論如何強迫使用另一個分隔符字符?像管道或雙管...等? – yathirigan

2

您可以@PostConstruct註釋,將豆後建造被稱爲嘗試。在這裏您可以加載配置文件並根據需要更新地圖。

例如:

@ConfigurationProperties(prefix = "config") 
@Component 
public class SampleConfigProperties { 

    private List<String> entry; 

    public List<String> getEntry() { 
     return entry; 
    } 

    public void setEntry(List<String> entry) { 
     this.entry = entry; 
    } 
} 

這應該你的屬性乾淨加載到您的SampleConfigPropertiesentry領域:

@Component 
public class Config { 
    private Map<String, String> entry = new LinkedHashMap<String, String>(); 

    @PostConstruct 
    private void init() throws IOException { 
     try (InputStream input = ClassUtils.getDefaultClassLoader().getResourceAsStream("config.properties")) { 
      for (String line : IOUtils.readLines(input)) { 
       // change the logic as per your need 
       String[] keyValue = line.split("=")[1].split(","); 
       entry.put(keyValue[0], keyValue[1]); 
      } 
     } 
    } 
} 
+0

不會@ConfigurationProperties允許直接加載這種名稱 - 值對值的方法嗎? ..這將是最後的選擇 – yathirigan

+0

我不這麼認爲,因爲它是你自己的自定義文件,不符合全球要求。 – Braj

+0

這種方法有什麼問題嗎?你能告訴我爲什麼是最後的選擇嗎? – Braj

相關問題