SpEL 在@Document indexName 中使用 spring data elasticsearch 和 spring boot 未被解析

SpEL used in @Document indexName with spring data elasticsearch and spring boot is not being parsed

使用 @Document 注释中的 SpEL 寻求一些帮助,参考:

spring-data-elasticsearch:3.2.3.RELEASE 和 spring 启动 2.2.1 RELEASE

我无法通过谷歌搜索来解决这个问题,因为关键字会挑出不相关的问题(我已经看到 other (unanswered) question about dynamic indexName)。

我想设置

@Document(indexName = "${es.index-name}", ...)

indexName 的值源自 属性 (es.index-name) 中写入我的 application.properties 的值。

它使用文字字符串值 "${es.index-name}" 作为索引名称!

我也试过创建一个名为 EsConfig

@Component

字段 indexName 注释 @Value("${es.index-name}")

然后尝试使用 SpEL 访问此组件 属性 值:

@Document(indexName = "#{esConfig.indexName}", ...)

但这也不起作用(仍然解析为文字字符串并抱怨大写)。我已经通过调试器确认 EsConfig 组件正在正确解析 SpEL 并提供正确的值。但在到达 @Document

时失败

这里是完整的代码片段:

使用 @Document 和 SpEL 访问 application.properties

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Data
@Document(indexName = "${es.index-name}", type = "tests")
public class TestDocument {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private String id;
}

EsConfig data source Component(尝试使用和不使用 Lombok)

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("esConfig")
public class EsConfig {
  @Value("${es.index-name}")
  private String indexName;

  public String getIndexName() {
    return indexName;
  }

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

使用 @Document 和 SpEL 访问 EsConfig indexName 属性

@Data
@Document(indexName = "#{esConfig.indexName}", type = "tests")
public class TestDocument {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private String id;
}

使用名称和方法引用您的 bean:

@Document(indexName = "#{@esConfig.getIndexName()}")