С помощью Spring Data REST и Spring Data Mon go я хочу создать поле домена (в моем примере это поле username
домена User
) , вставляемое при создании, но un -обновляемый при обновлении. Другими словами, эквивалент JPA @Column (inserttable = true, updatable = false).
Я пробую несколько подходов, но не работаю. В моем проекте github класс домена и хранилище помещаются в /src/main/java/*/*/User.java и UserRepository. java. Тест помещается в /src/test/java/*/*UserTest.java.
1. Аннотация Spring Data @ReadOnlyProperty and @ Transient
Поле не может быть вставлено при сохранении в БД. См. Пакет readonlyproperty
и transient_
в проекте.
2. Аннотация Джексона @JsonProperty (access = READ_ONLY)
Поле невозможно вставить при создании с помощью запроса POST, поскольку свойство JSON игнорируется при инициировании объекта. Смотрите пакет jsonpropertyreadonly
в проекте.
3. @JsonCreator в конструкторе и @JsonIgnore в установщике
Если не обновляемое поле username
содержится в json теле запроса PUT или PATCH, а username
значение изменяется, username
обновляется, что неожиданно. Смотрите пакет jsoncreator
в проекте.
4. Не пишите сеттер
так же, как 3. См. Пакет nosetter
в проекте.
5. Функция включения / выключения
spring.jackson.deserialization.fail-on-ignored-properties=false
spring.jackson.deserialization.fail-on-unknown-properties=false
spring.jackson.mapper.infer-property-mutators=false
не помогает
Spring Data REST PUT и PATCH Внутренняя реализация
- PUT: используется Джексон
ObjectMapper.readerFor(Class)
для инициирования новый объект - PATCH: он использует Jackson
ObjectMapper.readerForUpdating(objectToUpdate).readValue(json)
, который использует setter для обновления objectToUpdate
. Кажется, readerForUpdating
не видит @JsonIgnore на сеттере.
Единственное известное мне решение - реализовать сеттер следующим образом
void setUsername(String usernameToSet) {
if (null == this.username)
this.username = usernameToSet;
}
И отключить метод PUT, только используйте PATCH для обновления. Смотрите пакет setterchecknull
.
Есть ли лучший способ? Большое спасибо !!