寻求使用SpEL在@Document
注释中的帮助,与以下内容相关:
spring-data-elasticsearch:3.2.3.RELEASE
和 spring boot 2.2.1 RELEASE
我在谷歌上搜索此问题时遇到了困难,因为关键字会捕捉到无关的问题(我已经看到了其他(未回答)有关动态indexName的问题)。
我想设置
@Document(indexName = "${es.index-name}", ...)
使用在我的application.properties
文件中编写的属性(es.index-name
)值派生的indexName
的值。
它实际上使用字面字符串值"${es.index-name}"
作为索引名称!
我还尝试创建一个名为EsConfig
的@Component
其中包含一个indexName
字段,该字段带有@Value("${es.index-name}")
注释
然后尝试使用SpEL访问此组件属性值:
@Document(indexName = "#{esConfig.indexName}", ...)
但这也不起作用(仍将其解析为字面字符串并抱怨大写)。我已通过调试器确认EsConfig
组件正确解析SpEL并提供正确的值。但在到达@Document
时失败。
以下是完整的代码片段:
使用访问application.properties
的SpEL和@Document
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数据源组件
(尝试使用和不使用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;
}
}
使用SpEL访问EsConfig的indexName属性时,可以使用@Document注解。
@Data
@Document(indexName = "#{esConfig.indexName}", type = "tests")
public class TestDocument {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
}
#{...}
的 SpelExpressionParser 进行解析。在该表达式中,您需要使用@
引用 bean,并且需要使用 getter 方法,而不是直接属性访问。您可以尝试使用#{es.index-name}
,但我不确定解析器是否使用环境或仅使用可用的 bean。 - P.J.Meisch