2016-11-20 123 views
2

在我的春天啓動的應用程序(與snakeyaml依賴性1.16)使用YAML我試圖根據關我application.yml文件的創建@ConfigurationProperties複雜的數據結構。我想創建像下面的JSON是具有字符串鍵和數組值的地圖的數據結構。Spring配置文件創建與YAML

mapName: { 
    "key1": ["elem0","elem1"], 
    "key2": ["hello","world"] 
} 

嘗試如下

@Component 
@ConfigurationProperties(prefix = "channel-broker") 
@EnableConfigurationProperties 
public class BrokerConfiguration { 

    private Map<String, Set<String>> broker = new HashMap<>(); 

    public Map<String, Set<String>> getBroker() { 
     return broker; 
    } 
} 

我已經嘗試了我的YAML下面創建一個Spring配置類

channel-broker: 
    broker: {message-delivery: ['all'], facebook: ['client1']} 

嘗試2

channel-broker: 
     message-delivery: ['all'] 
     facebook: ['client1'] 

嘗試3

channel-broker: 
     message-delivery: 
     - ['all'] 
     facebook: 
     - ['client1'] 

我也試圖在@ConfigurationProperties類這樣... new HashMap<String, Set<String>>初始化HashMap中並沒有工作或者

所有的嘗試導致這個錯誤,使我相信它的錯誤轉換爲對象時不yaml語法有任何問題。

所致:org.springframework.beans.InvalidPropertyException:無效 屬性 'brokerTest [消息交付] [0]' bean類的 [my.classpackage.clasname]: 屬性,索引屬性路徑引用 「brokerTest [消息交付] [0]」既不是一個數組,也不是一個列表,也不是 地圖;返回值爲[全部]

是否可以創建這樣的對象?我將如何做到這一點

-UPDATE-

如果我改變設置到一個ArrayList(或List接口)這個工作,但不是我要找的。改變這種

private Map<String, ArrayList<String>> brokerTest = new HashMap<>(); 

但需要這不符合設置接口工作,要麼:

private Map<String, HashSet<String>> brokerTest = new HashMap<>(); 

回答

0

這個問題是由YAML文件的格式造成的。下面的結構讓我打造出來的YAML

channel-broker: 
     message-delivery: 
     all 
     facebook: 
     client1 

我喜歡圖形數據結構的設置不​​希望任何額外周圍的關鍵。請注意,如果您的設置將包含多個值,您可以添加一個逗號將它們分開。就像Json的最後一個元素之後不會有一個逗號。

0

你所尋找的是這樣的:

channel-broker: {broker: {message-delivery:['all', ...], facebook:['client1', ...]}} 

看到Complete idiot's introduction to yaml

+0

這產生如我先前接收到的同樣的錯誤,這是「在索引屬性路徑‘經紀人[消息交付] [0]’既不是一個數組,也不是一個列表,也不是一個地圖引用屬性;返回值爲[全部]「 –

0

如果你使用[]那麼它是一個數組,因此arraylist工作,對於hashset/hashmap你需要使用{}括號。

channel-broker: { 
    broker: { 
     message-delivery:{'all', '123'}, 
     facebook:{'client1', 'cleant2'} 
    } 
} 

將用於hashset。

hashmap example