2015-09-29 20 views
7

Ho un'applicazione Spring Spring Elasticsearch che utilizza uno dei due profili: application.dev.properties o application.prod.properties. Quella parte funziona bene. Sto riscontrando problemi nel far leggere da elasticsearch esterno da application.xxx.properties.Spring Boot Configurazione Elasticsearch

Questo funziona:

@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()); 
    } 
} 

ma ovviamente non risolve il mio problema multi-ambiente.

Ho anche provato le annotazioni @Value per le variabili host e porta senza esito positivo.

Come è possibile convertire quanto sopra per leggere i suoi valori dal file delle proprietà dell'applicazione o scegliere un file @PropertySource diverso in base al profilo che si desidera eseguire?

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

Grazie

+0

Perché non sei solo utilizzando Primavera Boot ma cercando di lavorare intorno ad esso. L'avvio a molla carica già un file di proprietà in base al profilo selezionato. Quindi in pratica lo stai rendendo difficile ... Inoltre Spring Boot configura già ElasticSearch per te, quindi perché stai provando a farlo di nuovo da te .. –

risposta

13

Togliere la classe e le proprietà di configurazione.

Aggiungere il seguente dipendenza

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

Basta aggiungere le spring.data.elasticsearch oggetti da un application-prod.properties e application-dev.properties e il cambiamento per l'ambiente desiderato. Questo è descritto nel ElasticSearch section della guida di avvio di primavera.

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

Il valore in entrambi i file sarà ovviamente diverso (o mettere il default nella application.properties e semplicemente ignorare un application-dev.properties.

Primavera di avvio sarà basato sul file spring.profiles.activeload the desired properties.

Ci

+0

Grazie per il feedback. Ogni volta che cerco di utilizzare solo le proprietà senza la configurazione personalizzata, esegue sempre la memoria interna Elasticsearch e non il mio server esterno. –

+1

Questo non dovrebbe essere il caso se si specificano le proprietà del nodo del cluster (questo è anche spiegato nella guida di riferimento). –

+0

Ho letto la guida di riferimento su ES. Qualcos'altro che sto facendo deve essere in conflitto con la riga spring.data.elasticsearch.cluster-node nelle proprietà dell'applicazione. Ecco perché ho provato a creare manualmente la configurazione. –

1

Sono d'accordo con Deinum, se si utilizza Spring Boot otterrà le proprietà dal profilo attivo attivo

mi hanno profili differenti nel mio progetto e questa è la mia configurazione 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); 

    }