在 Spring Data REST + MongoDB 中使字段可插入但不可更新

yej*_*lue 10 jackson spring-data-rest spring-data-mongodb

使用 Spring Data REST 和 Spring Data Mongo,我希望使域字段(在我的示例中username为域字段)在创建时可插入,但在更新时不可更新。换句话说,相当于 JPA @Column(insertable = true, updatable = false)。User

我尝试了几种方法但不起作用。在我的github项目中,域类和存储库放在/src/main/java/*/*/User.java和UserRepository.java中。测试放在/src/test/java/*/*UserTest.java 中。

1.Spring Data注解@ReadOnlyProperty和@Transient

保存到数据库时该字段不可插入。请参阅包readonlypropertytransient_项目中的内容。

2. Jackson注解@JsonProperty(access=READ_ONLY)

通过 POST 请求创建时,该字段不可插入,因为初始化对象时会忽略 JSON 属性。jsonpropertyreadonly请参阅项目中的包。

3.构造函数上的@JsonCreator和setter上的@JsonIgnore

username如果PUT 或 PATCH 请求的 json 正文中包含不可更新的字段,并且username值发生更改,username则会更新,这是意外的。jsoncreator请参阅项目中的包。

4.不要写setter

同3。参见nosetter项目中的package。

5. 开启/关闭功能

spring.jackson.deserialization.fail-on-ignored-properties=false
spring.jackson.deserialization.fail-on-unknown-properties=false
spring.jackson.mapper.infer-property-mutators=false
Run Code Online (Sandbox Code Playgroud)

没有帮助

Spring Data REST PUT 和 PATCH 内部实现

  • PUT:它使用 JacksonObjectMapper.readerFor(Class)来启动一个新对象
  • PATCH:它使用 Jackson ObjectMapper.readerForUpdating(objectToUpdate).readValue(json),它使用 setter 来更新objectToUpdate. 似乎readerForUpdating在设置器上没有看到@JsonIgnore。

我知道的唯一解决方案是通过以下方式实现设置器

spring.jackson.deserialization.fail-on-ignored-properties=false
spring.jackson.deserialization.fail-on-unknown-properties=false
spring.jackson.mapper.infer-property-mutators=false
Run Code Online (Sandbox Code Playgroud)

并且禁用PUT方法,只使用PATCH来更新。参见包setterchecknull

有没有更好的办法?非常感谢!!