Spring Data Elasticsearch Repository findById返回404问题
Spring Data Elasticsearch
findById 查询返回404排查方案 核心排查点按优先级排序:
- @Document索引名配置错误
检查TaskBean类上@Document注解的indexName取值,必须和实际索引名完全一致:你实际索引是_idx1(带下划线前缀),如果注解里写的是idx1、或者配置了全局索引前缀自动拼接、或者开启了日期后缀自动追加,最终请求的索引路径就会和实际索引不匹配,直接查不到结果。
验证方式:开启ES客户端wire日志,级别设为DEBUG,直接看实际发起的GET请求路径是不是/_idx1/_doc/440986688。 - @Id字段类型不匹配
Elasticsearch的_id字段默认存储为字符串类型,如果TaskBean里用@Id标注的字段是Long/Integer等数值类型,部分版本的Spring Data Elasticsearch会在查询时做类型编码,导致和ES中存储的字符串ID匹配失败。
修复方式:将@Id对应字段类型改为String,调用findById时传入字符串格式的ID"440986688"。 - 响应式客户端配置路由错误
检查ReactiveRestClientConfig中配置的ES服务地址、认证信息是否对应正确的集群环境,避免出现连到测试集群查生产索引的低级错误;如果配置了自定义的请求拦截器、索引路由规则,确认规则没有篡改查询的索引名和ID参数。 - 字段映射反序列化失败被误判为不存在
如果@Field注解配置的字段类型、字段名和ES实际mapping不匹配(比如ES中是text类型的字段,实体类声明为LocalDateTime且没有配置自定义转换器),Spring Data Elasticsearch反序列化文档失败时,不会抛出序列化异常,会直接返回空结果,表现为404。
验证方式:绕过Repository直接用底层Template执行原生查询,确认是否是映射问题:
如果这段代码抛出序列化相关异常,逐个核对reactiveElasticsearchTemplate.get( "440986688", TaskBean.class, IndexCoordinates.of("_idx1") ).subscribe(System.out::println, Throwable::printStackTrace);@Field的name、type属性和ES实际mapping的一致性,字段名大小写、下划线命名要完全对应。 - Repository接口泛型绑定错误
确认TaskBeanRepository继承自ReactiveElasticsearchRepository<TaskBean, String>,泛型指定的实体类、ID类型和实际定义一致,不要混用非响应式的ElasticsearchRepository和响应式客户端,会出现上下文加载异常导致查询路由错误。
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

