使用 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;
}
当我尝试使用 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;
}