当我尝试使用@Document
持久化CrudRepository
时,对象中的所有空字段都不会写入数据库。
示例(对象obj):
{
"field1": {
"field11": 123
},
"field2": null,
"field3": "abc"
}
objRepo.save(obj)
,field2不会写入Couchbase。
是否有可能覆盖spring存储库的行为以保存空值?我是否必须创建自己的MappingCouchbaseConverter
或者可能与TranslationService
有关?
答案 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;
}