J'ai une application Spring Boot Elasticsearch fonctionnelle qui utilise l'un des deux profils: application.dev.properties ou application.prod.properties. Cette partie fonctionne bien. J'ai du mal à obtenir la lecture elasticsearch externe à partir du fichier application.xxx.properties.
Cela marche:
@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());
}
}
mais évidemment ne résout pas mon problème multi-environnement.
J'ai également essayé les annotations @Value pour les variables Host et port sans succès.
Comment puis-je convertir ce qui précède pour lire ses valeurs dans le fichier de propriétés de l'application ou choisir un autre fichier @PropertySource en fonction du profil que je veux exécuter?
spring.data.elasticsearch.properties.Host = 10.10.1.10
spring.data.elasticsearch.properties.port = 9300
Merci
Supprimez votre classe de configuration et vos propriétés.
Ajoutez la dépendance suivante
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
Ajoutez simplement le spring.data.elasticsearch
propriétés à un application-prod.properties
et application-dev.properties
et changez pour l'environnement souhaité. Ceci est décrit dans la section ElasticSearch du guide Spring Boot.
spring.data.elasticsearch.cluster-nodes=10.10.1.10:9300
La valeur dans l'un ou l'autre fichier sera bien sûr différente (ou placez la valeur par défaut dans le application.properties
et simplement remplacer par un application-dev.properties
.
Spring Boot sera basé sur le spring.profiles.active
charger les propriétés souhaitées fichier.
Il n'est pas nécessaire de vous pirater.
Je suis d'accord avec Deinum, si vous utilisez Spring Boot, il obtiendra les propriétés du profil actif.
J'ai différents profils dans mon projet et voici ma configuration 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);
}