我想在实体“用户”上实现 PATCH-Requese,以使用附加的瞬态属性“旧密码”更改密码,以便在 EventHandler 中进行比较。
POST 和 PUT 请求填充属性。
PATCH 请求没有:'oldpassword' 为空。
我在用着
- spring-boot-starter-parent
- spring-boot-starter-data-rest (2.1.6)
- spring-boot-starter-web (2.1.6)
- spring-boot-starter-data-jpa (2.1.6)
- 弹簧数据-jpa 2.1.9
- 弹簧数据休息 3.1.9
- spring-security 5.1.5(可能不相关)
我试过了
- 注释 @JsonProperty("oldpassword") (即使 POST 和 PUT 工作)。
- 注释@JsonDeserialize(JSON:@Transient 字段未序列化)
- 配置 Jackson 以禁用检查 @Transient 注释(JPA Transient Annotation 和 JSON)
- @JsonAutoDetect(fieldVisibility = Visibility.ANY) 作为类装饰器
简化的代码是:
实体“用户”
@Entity
public class User implements UserDetails, Serializable {
[...]
@NotNull
String password;
@Transient
String newpassword;
@Transient
String oldpassword;
public void setPassword(String password) {
this.newpassword = password;
}
public void setOldpassword(String oldpassword) {
this.oldpassword = oldpassword;
}
[...]
}
存储库
@RepositoryRestResource(exported = true)
public interface UserRepository extends JpaRepository<User, Long> {
}
补丁请求(
HTTP Method = PATCH
Request URI = /api/users/2
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Basic aXJ0Z2VuZGFhczpFaW4gcGFzc3dvcmQ="]
Body = {
"username": "myusername",
"password": "mynewpassword",
"oldpassword": "theoldone"
}
事件处理程序
@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {
@HandleBeforeSave
public void printdata(User p) {
/* returns the new password*/
System.out.println("newpassword" + p.newpassword);
/* returns null (if it's a PATCH-request) */
System.out.println("oldpassword" + p.oldpassword);
/* returns the old persisted password */
System.out.println("password" + p.password);
}
}
瞬态属性“newpassword”有效,因为我使用了持久属性“password”的设置器。