升级Spring Boot 2.5.4后@Document标注接口类查询报错如何解决
问题原因
Spring Boot 2.5.4 对应的 Spring Data Elasticsearch 版本为 4.2.x,该版本调整了实体映射逻辑:执行查询前会提前校验传入的实体类是否可实例化,校验不通过直接抛出异常,不会进入后续 Jackson 反序列化阶段。你之前的写法依托 Jackson 多态注解动态实例化实现类,但框架层新增的校验逻辑会直接拦截接口类型的实体参数,因此报错。
问题答疑
- 该版本仍支持同一索引存储多种类型实体,只是实体参数校验逻辑更严格,并非该特性被移除。
- 你可以通过
ElasticsearchCustomConversions实现该需求,但不是唯一方案,也不是最优方案。
解决方案
方案1:仅count查询场景的极简修复
count查询不需要实际反序列化实体,直接指定索引名即可,不需要传入Customer.class:
elasticsearchOperations.count(query, "customers");
方案2:需要返回实体列表的通用修复
保留你现有全部Jackson多态注解,只需自定义Elasticsearch转换器配置,让框架跳过接口实例化校验,直接走Jackson反序列化逻辑即可:
@Configuration public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Override public RestHighLevelClient elasticsearchClient() { // 保留你原有客户端配置即可 return RestClients.create(ClientConfiguration.create("127.0.0.1:9200")).rest(); } @Bean @Override public ElasticsearchConverter elasticsearchConverter() { MappingElasticsearchConverter converter = new MappingElasticsearchConverter(elasticsearchMappingContext()) { @Override public <R> R read(Class<R> type, org.springframework.data.elasticsearch.core.document.Document source) { // 直接调用Jackson反序列化,复用已有的多态注解配置 return objectMapper().convertValue(source, type); } }; converter.setConversions(elasticsearchCustomConversions()); return converter; } }
配置完成后,你原来的elasticsearchOperations.count(query, Customer.class)写法,以及返回List<Customer>的查询都可以正常运行。
方案3:通过ElasticsearchCustomConversions实现
如果要使用转换器方案,先自定义Customer的读转换器:
@ReadingConverter public class DocumentToCustomerConverter implements Converter<Document, Customer> { private final ObjectMapper objectMapper; public DocumentToCustomerConverter(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public Customer convert(Document source) { return objectMapper.convertValue(source, Customer.class); } }
再在配置类中注册该转换器即可:
@Override public ElasticsearchCustomConversions elasticsearchCustomConversions() { return new ElasticsearchCustomConversions(List.of(new DocumentToCustomerConverter(objectMapper()))); }
内容的提问来源于stack exchange,提问作者Stefan Dietl
相关产品推荐
相关产品推荐

