स्ट्रिंग्स की एक सूची के लिए स्प्रिंग बूट यम विन्यास


149

मैं application.yml फ़ाइल से स्ट्रिंग्स की एक सरणी लोड करने का प्रयास कर रहा हूं। यह विन्यास है:

ignore:
    filenames:
        - .DS_Store
        - .hg

यह वर्ग है:

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

उसी वर्ग में अन्य विन्यास हैं जो ठीक लोड करते हैं। मेरी यमल फ़ाइल में कोई टैब नहीं हैं फिर भी मुझे निम्नलिखित अपवाद मिलते हैं:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"

जवाबों:


71

मेरा अनुमान है, कि @Value"जटिल" प्रकारों का सामना नहीं किया जा सकता है। आप इस तरह एक प्रोप क्लास के साथ जा सकते हैं:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

कृपया ध्यान दें: यह कोड Groovy है - जावा नहीं - उदाहरण को छोटा रखने के लिए! टिप्स को अपनाने के लिए टिप्पणियों को देखें।

पूरा उदाहरण देखें https://github.com/christoph-frick/so-springboot-yaml-string-list


1
आप एक अल्पविराम से अलग हो सकते हैं @Value(जब तक कि एक कनवर्टर पंजीकृत है, जिसे वह स्प्रिंग बूट में होगा जो मुझे लगता है)।
डेव सीर

2
यह स्ट्रिंग सेटिंग्स उठा रहा है, लेकिन सूची <स्ट्रिंग> सेटिंग नहीं
बहादुर यानि

1
मैं इसके साथ काम करने के लिए नहीं मिल सका @Configuration, लेकिन @Componentइसके बजाय चाल का उपयोग किया।
स्टिजन वान बाल

1
@cfrick हाँ, यह एकमात्र बदलाव था जो मैंने किया था। दोनों एनोटेशन के उद्देश्य को देखते हुए, मैं कहूंगा कि @Componentयह अधिक उपयुक्त है: stackoverflow.com/questions/12229282/…
Stijn Van Bael

2
ऐसा लगता है कि यह स्प्रिंग बूट प्रक्रियाओं के साथ एक सीमा है जो एनोटेशन - github.com/spring-projects/spring-boot/issues/501
wontondon

133

Application.yml में अल्पविराम से अलग किए गए मानों का उपयोग करें

ignoreFilenames: .DS_Store, .hg

उपयोग के लिए जावा कोड

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

यह काम कर रहा है ;)


मैं उम्मीद कर रहा था कि यह ड्राप्वॉयर में भी काम करेगा: '(हालांकि धन्यवाद!
RST

1
यह सबसे अच्छा जवाब होना चाहिए था।
मोहम्मद एल्सेयद ने

3
मेरे अपने परीक्षणों में, यह ".DS_Store, .hg" के बराबर है, लेकिन ".DS_Store", ".hg" - "org.yaml.snakeyaml.parser.ParserException:" के साथ विफल रहता है, जबकि ब्लॉक मैपिंग पार्स करते समय "। तो आप वास्तव में यहां क्या कर रहे हैं, एक संपत्ति को एक अल्पविराम से अलग स्ट्रिंग (जो स्प्रिंग फिर एक सरणी या सूची में विभाजित करता है) के बजाय एक YAML सरणी प्रदान कर रहा है। यह "काम करता है" लेकिन मूल प्रश्न का उत्तर नहीं देता है। मुझे अभी तक @Value एनोटेट सेम प्रॉपर्टी में YAML सरणी पार्स करने का कोई तरीका नहीं मिला है।
झिरझिरिकोस

38

स्प्रिंग बूट डॉक्स से https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

YAML सूचियों को [सूचकांक] dereferencers के साथ संपत्ति कुंजी के रूप में दर्शाया जाता है, उदाहरण के लिए यह YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

इन गुणों में बदल जाएगा:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

स्प्रिंग डेटाबाइंडर उपयोगिताओं (जो कि क्या @ConfigurationPropertiesकरता है) जैसी संपत्तियों के लिए बाध्य करने के लिए, java.util.Listआपको टाइप के लक्ष्य बीन में एक संपत्ति की आवश्यकता होती है और आपको या तो एक सेटर प्रदान करने की आवश्यकता होती है, या इसे एक परिवर्तनशील मूल्य के साथ आरंभ करना होता है, जैसे कि यह बाइंड करेगा। उपरोक्त गुणों के लिए। यहाँ प्रश्न का कोड कैसा दिखेगा।

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}

2
यह काम करना चाहिए, getXxx()इसके लिए काम करने के लिए BTW आवश्यक है, और इसका उपयोग करना चाहिए List, नहीं Set
एरिक वांग

Yaml में, ArrayList के लिए मानों की सूची अल्पविराम सीमांकित सूची हो सकती है। मेरे मामले में, मेरे पास कई मूल्य हैं, इसलिए एक कॉम्पैक्ट सूची प्रति पंक्ति आइटम की तुलना में क्लीनर है। इसलिए उदाहरण में, आप सर्वर कर सकते हैं: dev.bar.com, foo.bar.com
वायोलमन जुएल

25

अहमत के जवाब के अलावा आप कोमा से अलग स्ट्रिंग को >सिंबल का उपयोग करके जोड़ सकते हैं ।

application.yml :

ignoreFilenames: >
  .DS_Store, 
  .hg

जावा कोड :

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;

यह तब तक अच्छा काम करता है जब तक आपके तार में कोई और अल्पविराम (,) नहीं है।
वैलेंटाइन देसपा

यह सरणी सूची के रूप में गुणों को पढ़ने के लिए काम नहीं करता है। यह उन्हें एकल स्ट्रिंग के रूप में पढ़ता है।
श्री लक्ष्मी

6

अहमत का जवाब यह बताता है कि कॉमा को अलग किए गए मानों को स्ट्रिंग ऐरे में कैसे नियत किया जाए।

विभिन्न वर्गों में उपर्युक्त विन्यास का उपयोग करने के लिए आपको इसके लिए गेटर्स / सेटर बनाने की आवश्यकता हो सकती है .. लेकिन यदि आप इस कॉन्फ़िगरेशन को एक बार लोड करना चाहते हैं और इसे ऑटोनैड एनोटेशन के साथ बीन के रूप में उपयोग करना जारी रखते हैं, तो यहां बताया गया है कि मैंने कैसे पूरा किया:

ConfigProvider.java में

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

बाहरी कक्षाओं में:

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

आप एक ही सूची का उपयोग हर जगह ऑटोरायरिंग द्वारा कर सकते हैं।


यह काम करता है। मेरे मामले में हालांकि आवेदन विफल हो गया, जब तक कि मैं @Configurationकक्षा की शुरुआत में नहीं जोड़ता ConfigProvider.java। अन्यथा मुझे स्रोत
डायना

3
@Value("#{'${your.elements}'.split(',')}")  
private Set<String> stringSet;

yml फ़ाइल:

your:
 elements: element1, element2, element3

बहुत कुछ है जो आप स्प्रिंग स्पेल के साथ खेल सकते हैं।


2

ठीक है, केवल एक चीज जो मैं इसे काम कर सकता हूं वह ऐसा है:

servers: >
    dev.example.com,
    another.example.com

@Value("${servers}")
private String[] array;

और अपनी कक्षा के ऊपर @Configuration को न भूलें ...।

बिना "," जुदाई, ऐसी कोई किस्मत नहीं ...

भी काम करता है (बूट 1.5.8 छंद)

servers: 
       dev.example.com,
       another.example.com

-1

मेरे मामले में यह .yml फ़ाइल में एक सिंटैक्स समस्या थी। मैं था:

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

और मेरी .yml फ़ाइल में सूची:

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

@ मान-एनोटेट फ़ील्ड में नहीं पढ़ रहा था। जब मैंने .yml फ़ाइल में सिंटैक्स को बदल दिया है:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

यह ठीक काम किया।


वसंत-बूट 1.5 पर यह कोशिश करना यह काम नहीं करता है। बूटस्ट्रैप-सर्वर के बाद आपको एक बृहदान्त्र की आवश्यकता होती है
Taugenichts

-2
@Value("${your.elements}")    
private String[] elements;

yml फ़ाइल:

your:
 elements: element1, element2, element3

1
यह कैसे अलग रूप है अहमत का जवाब? stackoverflow.com/a/41462567/2065796
साशा शपोता

1
उत्तर पहले से ही प्रदान किया गया। केवल अंकों के लिए जवाब देने से मूल्य नहीं
दीपक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.