【问题标题】:Null values not persisted to Couchbase using spring-data-couchbase空值不使用 spring-data-couchbase 持久化到 Couchbase
【发布时间】:2017-01-26 22:54:30
【问题描述】:

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

示例(对象 obj):

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果你设法让它合理地配置,那将是一个很好的 PR 候选人 :)
    • 谢谢你的信息,我看看我能想出什么。如果您不介意,请查看我的其他问题:stackoverflow.com/questions/39571003/…
    【解决方案2】:

    所以我遇到了同样的问题,从 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2017-08-10
      • 2016-04-13
      • 1970-01-01
      • 2016-09-30
      相关资源
      最近更新 更多