首页 > 解决方案 > Spring data @ReadOnlyProperty 导致意外行为

问题描述

我有一个 Model 属性需要设置 @ReadOnlyProperty 以便在第一次插入行后它不会持续存在。

假设我的模型如下

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(updatable = false, nullable = false)
    @JsonIgnore
    private Long id;

    @Column(unique = true, nullable = false)
    @ReadOnlyProperty
    private String openId;
}

然后我有一个 UserRepository:

public interface UserRepository extends JpaRepository<User, Long> {

}

然后我为 POST 和 PUT 提供了 2 个 Restful API。

创建用户操作代码如下:

user.setOpenId(1);
userRepository.save(user)

更新用户操作几乎相同:

user.setOpenId(2);
user = userRepository.save(user);

我很惊讶用户的 openId 属性将被更改,在 POST 和 PUT 之后,返回的用户对象将具有更改的值。(user.getOpenId() == 2)

看起来@ReadOnlyProperty 不起作用,我使用的是 spring-boot-starter-data-jpa 的 RELEASE 版本。有人可以帮忙解释一下吗?

标签: spring-bootspring-data-jpaspring-data

解决方案


似乎这@ReadOnlyProperty行不通。以下错误报告已开放多年:

带有 @ReadOnlyProperty 注释的属性在 PATCH 请求中被取消

如果要拒绝通过 Spring Data Rest 端点修改属性,请使用@JsonProperty(access = Access.READ_ONLY)注解。它会影响 JSON 反序列化,因此带注释的属性永远不会到达 Spring Data Rest。

如果您还需要拒绝通过 Spring Data JPA 写入属性,则可以使用以下 JPA 注释:@Column(updatable=false)它拒绝覆盖底层 JPA 级别,而不是 Spring Data JPA 级别。


推荐阅读