È possibile utilizzare Spring @Value per mappare i valori dal file delle proprietà a HashMap?
Sì, lo è. Con un piccolo aiuto di codice e Spel.
In primo luogo, considerare questa primavera-bean Singleton (si dovrebbe eseguire la scansione):
@Component("PropertySplitter")
public class PropertySplitter {
/**
* Example: one.example.property = KEY1:VALUE1,KEY2:VALUE2
*/
public Map<String, String> map(String property) {
return this.map(property, ",");
}
/**
* Example: one.example.property = KEY1:VALUE1.1,VALUE1.2;KEY2:VALUE2.1,VALUE2.2
*/
public Map<String, List<String>> mapOfList(String property) {
Map<String, String> map = this.map(property, ";");
Map<String, List<String>> mapOfList = new HashMap<>();
for (Entry<String, String> entry : map.entrySet()) {
mapOfList.put(entry.getKey(), this.list(entry.getValue()));
}
return mapOfList;
}
/**
* Example: one.example.property = VALUE1,VALUE2,VALUE3,VALUE4
*/
public List<String> list(String property) {
return this.list(property, ",");
}
/**
* Example: one.example.property = VALUE1.1,VALUE1.2;VALUE2.1,VALUE2.2
*/
public List<List<String>> groupedList(String property) {
List<String> unGroupedList = this.list(property, ";");
List<List<String>> groupedList = new ArrayList<>();
for (String group : unGroupedList) {
groupedList.add(this.list(group));
}
return groupedList;
}
private List<String> list(String property, String splitter) {
return Splitter.on(splitter).omitEmptyStrings().trimResults().splitToList(property);
}
private Map<String, String> map(String property, String splitter) {
return Splitter.on(splitter).omitEmptyStrings().trimResults().withKeyValueSeparator(":").split(property);
}
}
Nota:PropertySplitter
classe utilizza Splitter
utilità dal Guava. Si prega di fare riferimento a its documentation per ulteriori dettagli.
Poi, in qualche chicco di tuo:
@Component
public class MyBean {
@Value("#{PropertySplitter.map('${service.expiration}')}")
Map<String, String> propertyAsMap;
}
E, infine, la proprietà:
service.expiration = name1:100,name2:20
Non è esattamente quello che hai chiesto, perché questa PropertySplitter
opere con una sola proprietà che è trasformato in un Map
, ma penso che sia possibile passare a questo modo di specificare le proprietà o modificare il codice PropertySplitter
in modo che corrisponda al modo più gerarchico di desiderio.
nuovo e Spring fabbrica di fagioli sono ortogonali. nuovi mezzi "no Spring" – duffymo
@duffymo non può essere generalizzato in questo modo. nuova Entità, nuovo ValueObject non rientra in questo – madhairsilence