org.springframework.data.mapping.model.MappingInstantiationException: не удалось создать экземпляр объекта с новым логическим полем

В моем приложении Spring-Boot и Couchbase есть объект Cat в БД.

В новой версии приложения мы добавили новое логическое поле в объект out Cat document:

@RequiredArgsConstructor
@AllArgsConstructor(onConstructor = @__(@PersistenceConstructor))
@Document
@Data
@Builder
@EqualsAndHashCode
public class Cat {
....
@Field
final boolean isHungry

Но сейчас у нас уже есть объекты Cat, которые находятся в БД и не имеют этого поля.

Когда приложение пытается прочитать эти Cats, мы получаем эту ошибку:

org.springframework.data.mapping.model.MappingInstantiationException: Failed 
  to instantiate com.example.Cat using constructor public 
  com.example.Cat(...) with arguments ... 
...
Caused by: java.lang.IllegalArgumentException: Parameter isHungry must not be null!

Нет ли способа сообщить Spring, что если поле отсутствует в БД, оно должно использовать значение по умолчанию (в данном случае false)


person riorio    schedule 13.12.2018    source источник


Ответы (2)


Попробуйте создать конструктор со всеми параметрами, кроме isHungry, и установите для isHungry значение false.

person aBnormaLz    schedule 13.12.2018
comment
Потенциальная проблема, которую я вижу при добавлении другого конструктора, заключается в том, что если в будущем в Cat будет добавлено больше полей, нам потребуется много конструкторов с разными комбинациями (например, без isHungry, без isHungry и favoriteToy.... ) - person riorio; 16.12.2018

Как насчет замены isHungry на Boolean и добавления геттера, который будет отображать null на false?

person Mafor    schedule 15.12.2019