【问题标题】:Spring Data Elasticsearch @Document indexName defined at runtimeSpring Data Elasticsearch @Document indexName 在运行时定义
【发布时间】:2016-01-09 06:08:45
【问题描述】:

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

谢谢!

【问题讨论】:

  • 还需要一些基于环境/配置文件的解决方案。硬连线到注释中的索引名称不是最佳选择...
  • 我尝试使用与使用 @Value 时类似的方法来做同样的事情,但还没有运气。请参阅this question 了解更多信息。
  • 您不能以这种方式使用@Value,因为它不是由 Spring 管理/创建的 bean,而是由您使用 new MyBean() 管理/创建的。我仍然无法理解此注释设置背后的想法。例如,当对 dev 和 prod 使用不同的 indexName 时,每个人都必须处理这个问题。你是怎么做到的?
  • @DavidMarko,此时我想知道是否有人使用 spring-data-elasticsearch 进行了生产...有人知道一个例子吗?

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


【解决方案1】:

@Document 注解不允许在参数中直接传递索引名。但是我找到了解决方法。

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

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

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

之后可以像这样将索引注入@Documentation注解:

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

对我有用,希望对你有帮助。

最好的问候

【讨论】:

  • 谢谢,其实是SpEL解决方案
  • 您在哪里注册Bean?我在 @Configuration 注释的 ElasticsearchConfig 类中这样做了。显然我仍然得到java.lang.NoClassDefFoundError。有什么建议吗?
【解决方案2】:

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

这是我的做法:

  • 在由“<context:property-placeholder location="classpath:application.properties" />”加载的 application.properties 文件中为“index.name”键赋值

  • 创建一个名为 ConfigBean 并使用 @Named@Component 注释的 bean


    @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")

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

【讨论】:

  • 我不知道这是怎么做到的,但是“@Named”不能应用于类,并且“@Configuration”没有让 indexName 被发现
  • 好吧,也许你的“@Named”不能,但我的 javax.inject.Named 可以。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 2019-04-22
  • 2017-09-19
  • 2016-03-31
  • 2023-02-13
  • 2021-02-09
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多