spring-boot - 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 版本。有人可以帮忙解释一下吗?
解决方案
似乎这@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 级别。
推荐阅读
- powerbi - 用户基于其他表中的日期的 DAX 第一个日期
- regex - 如何在shell中使用正则表达式grep utc日期
- git - 无法使用 SSH 从 BitBucket 克隆
- c - 如何获得快速排序深度?
- node.js - 如何通过 Id 执行猫鼬查询并使用 nodejs 中的属性进行过滤?
- angular - Angular mat-table 显示每行中键值 json 的动态数据
- python - 包的依赖范围比从语义版本控制到日历版本控制(反之亦然)
- java - 使用 RxJava 通过某个键将 Flowable 转换为事件映射的最佳方法是什么?
- python - 根据边缘标签向路径添加额外成本
- docker - wurstmeister/Kafka:Docker swarm 中的 HOSTNAME_COMMAND 和 BROKER_ID_COMMAND 问题