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
相关产品推荐
相关产品推荐

