स्प्रिंग .properties फ़ाइल: एरियर के रूप में तत्व प्राप्त करें


94

मैं .propertiesस्प्रिंग के उपयोग से एक फ़ाइल से गुण विशेषताएँ लोड कर रहा हूँ :

file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6

वसंत xml फ़ाइल

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

और मेरा क्लास.जावा

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

लेकिन डिबगिंग करते समय, पैरामीटर तत्व केवल सूची में अंतिम तत्व प्राप्त करते हैं, इसलिए, 6 तत्वों के साथ एक सूची के बजाय "6" मूल्य के साथ एक तत्व की एक सूची है।

मैंने अन्य तरीकों की कोशिश की, जैसे केवल मूल्य में जोड़ना #{base.module}लेकिन फिर यह गुण फ़ाइल में कोई पैरामीटर नहीं पाता है।

तत्वों में एक वर्कअराउंड होना है। कॉम्पट्टी कॉमा द्वारा अलग की गई सूची को दर्ज करें, जैसे:

base.module.elementToSearch=1,2,3,4,5,6

और इसे एक स्ट्रिंग के रूप में उपयोग करें और इसे पार्स करें, लेकिन क्या इसका बेहतर समाधान है?



इसलिए मुझे इसे विधि में अल्पविराम से अलग स्ट्रिंग और पार्स के रूप में पारित करने की आवश्यकता है।
RamonBoza

वास्तव में, हालाँकि आपके लिए कुछ काम पहले से ही हैं (अपाचे कॉमन्स) - commons.apache.org/configuration/howto_properties.html
कॉलिन हेबर्ट

यहां एक जवाब है कि कम से कम आपको सेट <स्ट्रिंग> परिणाम मिलता है। काफी नहीं एक सूची <स्ट्रिंग>, लेकिन शायद कई मामलों में पर्याप्त है! stackoverflow.com/questions/5274362/…
जॉन रिक्स

जवाबों:


193

यदि आप अपने सरणी को गुण फ़ाइल में परिभाषित करते हैं जैसे:

base.module.elementToSearch=1,2,3,4,5,6

आप अपने जावा वर्ग में इस तरह के एरे को लोड कर सकते हैं:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;

5
मेरे तत्वों में अल्पविराम हैं। मैं विभाजक कैसे बचूं? '\', 'भी' \\, 'काम नहीं करते।
भोजपत्र

आप उन्हें पूर्णांक की सूची के रूप में प्राप्त करने का प्रयास कर सकते हैं और फिर उन्हें @Value ("$ {base.module.elementToSearch}") निजी सूची <Integer> elementToSearch;
गाल ब्राच

+1, बस मुझे जो चाहिए था। दुर्भाग्य से अल्पविराम से अलग किए गए मानों को एक List<String>ही अंदाज में पढ़ना काम नहीं लगता (सूची में सिर्फ एक तत्व होगा)।
जोनिक

5
मैं पुष्टि कर सकता हूं कि String[]टाइप वर्क के रूप में उपयोग करना , जहां उपयोग करना List<String>काम नहीं करता है।
विम देबलाउवे

3
यदि आप चाहते हैं कि List<String>इसके बजाय String[]आप के साथ काम करें , तो आपको कम से कम <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">अपने साथ जोड़ने की आवश्यकता है applicationContext.xml। अन्यथा रूपांतरण सेवा का उपयोग नहीं किया जाता है, लेकिन डिफ़ॉल्ट संपत्ति संपादक, जो स्ट्रिंग्स को संग्रह में परिवर्तित करने का समर्थन नहीं करते हैं, केवल सरणियाँ: docs.spring.io/spring/docs/current/spring-framework-reference/…
क्लेमेंस क्लेन-रोबेनहार

37

और आप अल्पविराम के अलावा एक अलग सी परिसीमा को लागू कर सकते हैं, आप उसका भी उपयोग कर सकते हैं।

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

तथा

आपके आवेदन गुणों में आप हो सकते हैं

my.config.values=value1, value2, value3

यह उपयोग अन्य एनोटेशनों के साथ भी काम करता है, मैंने @KafkaListener {विषयों = "# {'$ {ArrayProperty}' का उपयोग किया। स्प्लिट (',')}"} के लिए स्प्रिंग
काफ्का

32

यहाँ एक उदाहरण है कि आप इसे स्प्रिंग 4.0+ में कैसे कर सकते हैं

application.properties सामग्री:

some.key=yes,no,cancel

जावा कोड:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);

यह वही है जो मैं चाहता हूं, लेकिन env vars में ... मुझे env vars में SOME_KEY_0_ = हां SOME_KEY_1 = नहीं, आदि का उपयोग करने में सक्षम होना चाहिए, लेकिन मेरी गेटप्रॉपर्टी वापस आ रही है
Rhubarb

1

स्प्रिंग बूट के साथ एक व्यक्ति निम्नलिखित कार्य कर सकता है:

application.properties

values[0]=abc
values[1]=def

विन्यास वर्ग

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties
public class Configuration {

    List<String> values = new ArrayList<>();

    public List<String> getValues() {
        return values;
    }

}

इसकी आवश्यकता है, इस वर्ग के बिना या valuesकक्षा में यह काम नहीं कर रहा है।

स्प्रिंग बूट एप्लीकेशन क्लास

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);

    // notice #{} is used instead of ${}
    @Value("#{configuration.values}")
    List<String> values;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConsoleApplication.class, args);
    }

    @Override
    public void run(String... args) {
        LOG.info("values: {}", values);
    }

}

0

यदि आपको तारांकन चिह्न को पास करने की आवश्यकता है, तो आपको इसे उद्धरण के साथ लपेटना होगा।

मेरे मामले में, मुझे वेबस्कैट के लिए कॉर्स को कॉन्फ़िगर करने की आवश्यकता है। इसलिए, मैंने cors url को application.yml में डालने का फैसला किया। उत्पादों के लिए मैं विशिष्ट url का उपयोग करूँगा, लेकिन देव के लिए यह सिर्फ * का उपयोग करने के लिए ठीक है।

Yml फ़ाइल में मेरे पास है:

websocket:
  cors: "*"

विन्यास कक्षा में मेरे पास है:

@Value("${websocket.cors}")
private String[] cors;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.