2015-09-29 15 views
7

मेरे पास एक स्प्रिंग बूट लोचदार खोज अनुप्रयोग है जो दो प्रोफाइलों में से एक का उपयोग करता है: application.dev.properties या application.prod.properties। वह हिस्सा ठीक काम करता है। मुझे application.xxx.properties से पढ़ने के लिए बाहरी लोचदार खोज प्राप्त करने में समस्या है।स्प्रिंग बूट लोचदार खोज कॉन्फ़िगरेशन

यह काम करता है:

@Configuration 
@PropertySource(value = "classpath:config/elasticsearch.properties") 
public class ElasticsearchConfiguration { 

    @Resource 
    private Environment environment; 

    @Bean 
    public Client client() { 
     TransportClient client = new TransportClient(); 
     TransportAddress address = new InetSocketTransportAddress(
       environment.getProperty("elasticsearch.host"), 
       Integer.parseInt(environment.getProperty("elasticsearch.port")) 
     ); 
     client.addTransportAddress(address);   
     return client; 
    } 

    @Bean 
    public ElasticsearchOperations elasticsearchTemplate() { 
     return new ElasticsearchTemplate(client()); 
    } 
} 

लेकिन स्पष्ट रूप से मेरी बहु पर्यावरण मुद्दे को हल नहीं करता है।

मैंने सफलता के बिना होस्ट और पोर्ट चर के लिए @ वैल्यू एनोटेशन की भी कोशिश की है।

मैं उपरोक्त रूप से एप्लिकेशन गुण फ़ाइल से अपने मूल्यों को पढ़ने के लिए कैसे परिवर्तित कर सकता हूं या जिस भी प्रोफ़ाइल को चलाने के लिए चाहता हूं, उसके आधार पर एक अलग @PropertySource फ़ाइल चुन सकता हूं?

spring.data.elasticsearch.properties.host = 10.10.1.10 
spring.data.elasticsearch.properties.port = 9300 

धन्यवाद

+0

आप क्यों नहीं बस स्प्रिंग बूट का उपयोग नहीं कर रहे हैं, लेकिन यह हल करने के लिए कोशिश कर रहा। आपके द्वारा चुने गए प्रोफ़ाइल के आधार पर स्प्रिंग बूट पहले से ही एक प्रॉपर्टी फ़ाइल लोड करता है। तो आप मूल रूप से इसे कठिन बना रहे हैं ... इसके अलावा स्प्रिंग बूट पहले से ही आपके लिए लोचदार खोज को कॉन्फ़िगर करता है, तो आप इसे फिर से करने की कोशिश क्यों कर रहे हैं .. –

उत्तर

13

आपके विन्यास वर्ग और गुण निकालें।

निम्नलिखित निर्भरता

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId> 
</dependency> 

जोड़े बस वांछित पर्यावरण के लिए एक application-prod.properties और application-dev.properties और परिवर्तन के spring.data.elasticsearch गुण जोड़ें। यह वसंत बूट गाइड के ElasticSearch section में वर्णित है।

spring.data.elasticsearch.cluster-nodes=10.10.1.10:9300 

या तो फाइल में मूल्य निश्चित रूप से वहाँ अलग होगा (या application.properties में डिफ़ॉल्ट रख दिया और बस एक application-dev.properties साथ ओवरराइड।

स्प्रिंग बूट spring.profiles.activeload the desired properties फ़ाइल पर आधारित होगा।

अपने आप को चारों ओर हैक करने की कोई ज़रूरत नहीं है।

+0

प्रतिक्रिया के लिए धन्यवाद। जब भी मैं कस्टम कॉन्फ़िगरेशन के बिना केवल गुणों का उपयोग करने का प्रयास करता हूं, तो यह हमेशा एलियास्टिकसेर्च मेमोरी में आंतरिक चलाता है, न कि मेरे बाहरी सर्वर। –

+1

यदि आप क्लस्टर-नोड गुण निर्दिष्ट करते हैं तो यह मामला नहीं होना चाहिए (यह संदर्भ मार्गदर्शिका में भी समझाया गया है)। –

+0

मैंने ES पर संदर्भ मार्गदर्शिका पढ़ी। मैं कुछ और कर रहा हूं, एप्लिकेशन गुणों में spring.data.elasticsearch.cluster-nodes लाइन के साथ विरोधाभासी होना चाहिए। यही कारण है कि मैंने मैन्युअल रूप से कॉन्फ़िगरेशन बनाने की कोशिश की। –

1

यदि आप स्प्रिंग बूट का उपयोग कर रहे हैं तो मैं Deinum से सहमत हूं, यह सक्रिय प्रोफ़ाइल सक्रिय से सक्रिय गुण प्राप्त करेगा।

मैं अपने प्रोजेक्ट में विभिन्न प्रोफ़ाइल हैं और यह मेरा elasticsearch विन्यास है:

@Configuration 
public class ElasticSearchConfiguration { 
    @Value("${spring.data.elasticsearch.cluster-name}") 
    private String clusterName; 
    @Value("${spring.data.elasticsearch.cluster-nodes}") 
    private String clusterNodes; 
    @Bean 
    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException { 
      String server = clusterNodes.split(":")[0]; 
      Integer port = Integer.parseInt(clusterNodes.split(":")[1]); 
      Settings settings = Settings.settingsBuilder() 
       .put("cluster.name", clusterName).build(); 
      client = TransportClient.builder().settings(settings).build() 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(server), port)); 
      return new ElasticsearchTemplate(client); 

    } 
संबंधित मुद्दे