5

È possibile specificare dinamicamente (in fase di esecuzione) indexName per ogni @Document, ad esempio tramite un file di configurazione? Oppure è possibile rendere l'ambiente di primavera @Document (dev, prod) dipendente?Spring Data Elasticsearch @Document indexName definito in fase di esecuzione

Grazie!

+0

Anche bisogno di una soluzione basata su ambiente/profilo. Il nome dell'indice cablato nell'annotazione non è l'opzione migliore ... –

+0

Stavo provando a fare lo stesso usando qualcosa di simile a quando usi @Value, ma ancora nessuna fortuna. Vedi [questa domanda] (http://stackoverflow.com/questions/31829456/inject-spel-parameter-on-annotation-parameter-like-what-is-done-with-value-on) per maggiori informazioni. – Victor

+0

Non puoi usare @Value in questo modo perché non è un bean gestito/creato da Spring ma da te usando new MyBean(). Non riesco ancora ad avere un'idea dietro queste impostazioni di annotazione. Ad esempio, tutti devono occuparsi di questo quando si usa diffNome dell'indice per dev e prod. Come fai a fare questo? –

risposta

7

L'annotazione @Document non consente di passare direttamente il nome dell'indice nel parametro. Tuttavia ho trovato un lavoro in giro.

Nella mia classe di configurazione ho creato un bean che restituisce una stringa. In questa stringa ho iniettato il nome dell'indice con @Value:

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

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

In seguito è possibile iniettare l'indice nella annotazione @Documentation in questo modo:

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

Funziona per me, spero che ti possa aiutare.

migliori saluti

1

La soluzione da Bruno probabilmente funziona, ma il "Ho creato un Bean restituendo una stringa" parte è un po 'di confusione.

Ecco come lo faccio:

  • ho la chiave "index.name" valutate in un file application.properties caricato dal "<context:property-placeholder location="classpath:application.properties" />"

  • creare un fagiolo di nome ConfigBean annotato con @Named o @Component


    @Named 
    public class ConfigBean { 

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

     public String getIndexName() { 
     return indexName; 
     } 

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

    } 
  • Iniettare il valore di configBean.getIndexName() nella annotazione "@Document" utilizzando Primavera EL: @Document(indexName = "#{ configBean.indexName }", type = "myType")

P.S. : È possibile ottenere lo stesso risultato direttamente utilizzando il bean implicito "systemProperties" (qualcosa come # {systemProperties ['index.name']}) ma non ha funzionato per me ed è piuttosto difficile eseguire il debug poiché non è possibile risolvere sistemaProprietà in un contesto programmatico (https://jira.spring.io/browse/SPR-6651)