Нулевые значения не сохраняются в Couchbase с использованием spring-data-couchbase

Когда я пытаюсь сохранить @Document с помощью CrudRepository, все пустые поля в объекте не записываются в базу данных.

Пример (объект obj):

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

objRepo.save(obj), field2 не будет записано в Couchbase.

Есть ли возможность переопределить поведение репозитория Spring для сохранения нулей? Нужно ли мне создавать свои собственные MappingCouchbaseConverter или, может быть, это связано с TranslationService?


person prettyvoid    schedule 19.09.2016    source источник


Ответы (2)


Прямо сейчас нет поддержки для явного хранения нулей, поэтому вам, возможно, придется повозиться с MappingCouchbaseConverter. Я думаю изменить один из _ 2_ будет хорошим началом: что-то вроде выполнения writeSimpleInternal(null, target, prop.getFieldName()); для нулевого случая ...

person Simon Baslé    schedule 19.09.2016
comment
если вам удастся сделать его разумно настраиваемым, это будет хорошим кандидатом на пиар :) - person Simon Baslé; 19.09.2016
comment
Спасибо за информацию, посмотрю, что можно придумать. Если вы не возражаете, ответьте на мой другой вопрос: stackoverflow.com/questions/39571003/ - person prettyvoid; 19.09.2016

Итак, я столкнулся с той же проблемой, и с 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;
}
person Schaka    schedule 17.08.2018