Spring Boot中EntityMapper无法@Autowire的技术咨询
如何在Spring中自动注入Elasticsearch的EntityMapper
嘿,这个问题我之前也碰到过!Spring Data Elasticsearch默认并不会把EntityMapper(具体来说是DefaultEntityMapper)作为一个可自动注入的Bean注册到Spring容器里,这就是你用@Autowired时提示找不到Bean的原因。不过完全不用一直手动实例化,有两种靠谱的解决方式:
1. 手动配置@Bean注册EntityMapper
这是最直接的方案,你只需要在配置类里加一个@Bean方法,把DefaultEntityMapper注册到容器中,之后就能轻松用@Autowired注入了:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.core.convert.DefaultEntityMapper; import org.springframework.data.elasticsearch.core.convert.EntityMapper; @Configuration public class ElasticsearchConfig { @Bean public EntityMapper entityMapper() { return new DefaultEntityMapper(); } }
配置好之后,在需要用的类里直接注入:
@Autowired private EntityMapper entityMapper;
2. 通过ElasticsearchConverter间接获取(可选)
如果你不想单独注册EntityMapperBean,也可以注入Spring默认会注册的ElasticsearchConverter,它内部已经包含了EntityMapper实例,你可以这样获取:
import org.springframework.data.elasticsearch.core.ElasticsearchConverter; import org.springframework.beans.factory.annotation.Autowired; // 你的服务类中 @Autowired private ElasticsearchConverter elasticsearchConverter; public void processQueryScores() { EntityMapper entityMapper = elasticsearchConverter.getMappingContext().getEntityMapper(); // 这里就可以使用entityMapper处理你的查询得分逻辑了 }
不过这种方式不如直接注册Bean来得直观,如果你需要频繁使用EntityMapper,还是推荐第一种方案。
顺带提一句:如果你的项目用的是Spring Boot + Spring Data Elasticsearch的较新版本(比如Spring Boot 2.7+ 对应Spring Data Elasticsearch 4.4+),DefaultEntityMapper可能会被MappingElasticsearchConverter内部的实例替代,但核心逻辑不变——只要把EntityMapper注册为Bean,就能实现自动注入。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

