使用spring-data-couchbase,空值不会持久存储到Couchbase

时间:2016-09-19 09:41:54

标签: couchbase spring-data-couchbase couchbase-java-api

当我尝试使用@Document持久化CrudRepository时,对象中的所有空字段都不会写入数据库。

示例(对象obj):

{ 
    "field1": {
        "field11": 123
    },
    "field2": null,
    "field3": "abc"
}

objRepo.save(obj),field2不会写入Couchbase。

是否有可能覆盖spring存储库的行为以保存空值?我是否必须创建自己的MappingCouchbaseConverter或者可能与TranslationService有关?

2 个答案:

答案 0 :(得分:2)

现在不支持显式存储空值,因此您可能需要修改MappingCouchbaseConverter。我认为修改writeInternal方法之一将是一个良好的开端:类似于为空案例执行writeSimpleInternal(null, target, prop.getFieldName()); ...

答案 1 :(得分:0)

因此,我遇到了与spring-data-couchbase 3.x相同的问题,您需要扩展MappingCouchBaseConverter并基本上覆盖一堆方法(主要是复制私有方法)。

实际更改在

protected void writeInternal(final Object source, final CouchbaseDocument target,
        final CouchbasePersistentEntity<?> entity)

您将在哪里找到if (null != propertyObj)的支票,并添加带有以下内容的else块:

else {
    writeSimpleInternal(null, target, prop.getFieldName());
}

我觉得Spring团队可能只需添加一个选项来序列化null(或不序列化),然后进行此小的更改。但是,如果您不想等待这些更改-只需从其类继承,就可以覆盖转换器并将其添加到CouchBaseConfig中,如下所示:

@Override
public MappingCouchbaseConverter mappingCouchbaseConverter() throws Exception {
    CustomMappingCouchbaseConverter converter = new CustomMappingCouchbaseConverter(couchbaseMappingContext(), typeKey());
    converter.setCustomConversions(customConversions());
    return converter;
}