使用 spring-data-couchbase 不会将空值持久化到 Couchbase

Null values not persisted to Couchbase using spring-data-couchbase

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

示例(对象 obj):

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

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

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

目前不支持显式存储空值,因此您可能需要修改 MappingCouchbaseConverter。我认为修改 writeInternal 方法之一将是一个好的开始:比如为 null 情况做 writeSimpleInternal(null, target, prop.getFieldName()); ......

所以我 运行 遇到了同样的问题,从 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(或不序列化),然后进行这个小改动。但是,如果您不想等待这些更改 - 只需继承它们的 class,在您的 CouchBaseConfig 中覆盖并添加转换器,如下所示:

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