Spring数据@ReadOnlyProperty导致意外行为

时间:2019-02-21 18:47:29

标签: spring-boot spring-data-jpa spring-data

我有一个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版本。有人可以帮忙解释吗?

1 个答案:

答案 0 :(得分:0)

@ReadOnlyProperty似乎无效。以下错误报告已开放多年:

Properties with @ReadOnlyProperty annotation are being nullified in PATCH requests

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

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