1

我想在实体“用户”上实现 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(可能不相关)

我试过了

简化的代码是:

实体“用户”

@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”的设置器。

4

1 回答 1

0

您似乎想创建一个更改密码功能。它不会以这种方式工作。为它创建一个独特的控制器方法。

无论如何,这不是标准的 REST 请求。

于 2019-08-10T21:11:31.900 回答