Сделать поле вставляемым, но не обновляемым в Spring Data REST + MongoDB - PullRequest
0 голосов
/ 15 апреля 2020

С помощью 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.

Есть ли лучший способ? Большое спасибо !!

...