Spring Data Elasticsearch @Document indexName在运行时定义

时间:2015-10-11 20:15:05

标签: spring-mvc spring-boot spring-data spring-data-elasticsearch

是否可以为每个indexName动态(在运行时)指定@Document,例如,通过配置文件?或者是否可以使@Document Spring环境(dev,prod)依赖?

谢谢!

2 个答案:

答案 0 :(得分:13)

@Document注释不允许直接在参数中传递indexname。但是我找到了一个解决方法。

在我的配置类中,我创建了一个返回字符串的Bean。在这个字符串中,我用@Value注入了索引的名称:

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

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

之后可以将索引注入@Documentation注释,如下所示:

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

它适用于我,我希望它能帮到你。

祝你好运

答案 1 :(得分:2)

Bruno的解决方案可能有效,但“我创建了一个返回字符串的Bean”部分有点令人困惑。

我是这样做的:

  • 在“<context:property-placeholder location="classpath:application.properties" />

  • 加载的application.properties文件中对“index.name”键赋值
  • 创建一个名为ConfigBean的bean,注释为@Named@Component


    @Named
    public class ConfigBean {

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

      public String getIndexName() {
        return indexName;
      }

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

    }
  • 使用Spring EL将configBean.getIndexName()的值注入“@Document”注释:@Document(indexName = "#{ configBean.indexName }", type = "myType")

P.S。 :你可以使用隐式bean“systemProperties”(类似#{systemProperties ['index.name']}之类的东西)直接获得相同的结果,但它对我不起作用,因为你无法解决它很难调试程序化上下文中的systemProperties(https://jira.spring.io/browse/SPR-6651