5

Ist es möglich, die indexName für jede @Document dynamisch (zur Laufzeit) zu spezifizieren, zum Beispiel über eine Konfigurationsdatei? Oder ist es möglich, @Document Federumgebung (dev, prod) abhängig zu machen?Spring Data Elasticsearch @Document indexName zur Laufzeit definiert

Vielen Dank!

+0

Benötigen Sie auch einige Umgebung/profilbasierte Lösung. Der in der Annotation festverdrahtete Indexname ist nicht die beste Option ... –

+0

Ich habe versucht, dasselbe mit etwas zu tun, das ähnlich ist, wenn Sie @ Value verwenden, aber noch kein Glück. Siehe [diese Frage] (http://stackoverflow.com/questions/31829456/inject-spel-parameter-on-annotation-parameter-like-what-is-done-with-value-on) für weitere Informationen. – Victor

+0

Sie können @Value nicht auf diese Weise verwenden, da es sich hierbei nicht um eine Bean handelt, die von Spring verwaltet oder erstellt wird, sondern von Ihnen, wenn Sie MyBean() verwenden. Ich kann immer noch keine Idee hinter diesen Annotationseinstellungen haben. Jeder muss sich damit befassen, wenn er zum Beispiel diffent indexName für dev und prod verwendet. Wie machst Du das? –

Antwort

7

Die @Document-Annotation erlaubt nicht, den Indexnamen im Parameter direkt zu übergeben. Allerdings habe ich eine Arbeit gefunden.

In meiner Konfigurationsklasse habe ich eine Bean erstellt, die eine Zeichenfolge zurückgibt. In dieser Zeichenfolge injiziert ich den Namen des Index mit @Value:

@Value("${etrali.indexname}") 
private String indexName; 

@Bean 
public String indexName(){ 
    return indexName; 
} 

Danach ist es möglich, den Index in die @Documentation Anmerkung so zu injizieren:

@Document(indexName="#{@indexName}",type = "syslog_watcher") 

Es funktioniert für mich, ich hoffe es wird dir helfen.

Mit freundlichen Grüßen

1

Die Lösung von Bruno arbeitet wohl aber die „ich eine Bean Zurückgeben einer Zeichenfolge erstellt“ Teil ein wenig verwirrend ist.

Hier ist, wie ich es tun:

  • Haben die "index.name" Schlüssel in einer Datei application.properties von "<context:property-placeholder location="classpath:application.properties" />" geladen bewertet

  • Erstellen einer Bean mit dem Namen ConfigBean kommentierte mit @Named oder @Component


    @Named 
    public class ConfigBean { 

     @Value("${index.name}") 
     private String indexName; 

     public String getIndexName() { 
     return indexName; 
     } 

     public void setIndexName(String indexName) { 
     this.indexName = indexName; 
     }  

    } 
  • Injizieren den Wert configBean.getIndexName() in die "@Document" Anmerkung mit Spring EL: @Document(indexName = "#{ configBean.indexName }", type = "myType")

P. S. : Sie können das gleiche Ergebnis direkt mit der impliziten Bean "systemProperties" (etwas wie # {systemProperties ['index.name']}) erreichen, aber es hat nicht für mich funktioniert und es ist ziemlich schwer zu debuggen, da Sie nicht auflösen können systemProperties in einem programmatischen Kontext (https://jira.spring.io/browse/SPR-6651)

Verwandte Themen