1

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

示例(对象 obj):

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

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

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

4

2 回答 2

2

目前不支持显式存储空值,因此您可能不得不修改MappingCouchbaseConverter. 我认为修改其中一种writeInternal方法将是一个好的开始:类似于writeSimpleInternal(null, target, prop.getFieldName());为 null 案例做的事情......

于 2016-09-19T10:20:20.210 回答
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;
}
于 2018-08-17T10:19:16.430 回答