You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data ES4.1.15 createIndex=false失效 @JsonIgnore字段被持久化

Spring Data Elasticsearch 4.1.15 版本异常行为咨询

使用Spring Data Elasticsearch 4.1.15版本时,遇到两个不符合预期的问题:

  • 实体类配置createIndex=false参数时,索引仍会被创建或更新
  • 标注@JsonIgnore注解的字段仍被持久化存储

第一次测试过程

测试步骤:

  • 直接通过Kibana预先创建索引映射
  • 实体类添加注解配置createIndex = false
  • 新增一个标注@JsonIgnore注解的字段,该字段不在预先创建的索引映射中,相关代码如下:
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Document(indexName = "documentIndex", createIndex = false)
public class Document{
    @Id
    private String id;

    @JsonIgnore
    private String test;
} 

Document obj = new Document();
obj.setTest("testing");

ObjectMapper om = new ObjectMapper();
String jsonString = null;
jsonString = om.writeValueAsString(obj);
System.out.println(jsonString);

documentRepository.save(obj);

测试现象:直接使用ObjectMapper序列化得到的jsonString不包含test字段,符合预期,但调用documentRepository.save(obj)保存对象后,Elasticsearch中存入了该新字段,且索引映射被自动更新新增了该字段。

对照测试:在旧版本Spring Data Elasticsearch 3.2.6(基于TransportClient)中进行相同操作,@JsonIgnore标注的字段不会被保存,索引映射也不会被更新。


第二次测试过程

在4.1.15版本中新建实体类,预先不创建任何索引映射,相关代码如下:

@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Document(indexName = "test_index", createIndex = false)
public class ZTest {
    @Id
    private String id;

    @JsonIgnore
    private String test;
}

@Repository
public interface ZTestRepository  extends ElasticsearchRepository<ZTest, String> {
}

ZTest test = new ZTest();
test.setTest("ztest_testing");

zTestRepository.save(test);

测试现象与第一次测试一致:索引被自动创建,@JsonIgnore标注的字段被存入Elasticsearch,查询返回结果如下:

"hits" : [
  {
    "_index" : "test_index",
    "_type" : "_doc",
    "_id" : "xvYrc4EB2riOtG2n0GCk",
    "_score" : 1.0,
    "_source" : {
      "_class" : "com.bean.ZTest",
      "test" : "ztest_testing"
    }
  }
]

核心疑问

上述现象是否属于框架的有效缺陷?

内容的提问来源于stack exchange,提问作者Abe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:06:10