2017-08-28 97 views
0

我正面临一个实体的场景用户其中有一个字段密码(其中,但这些并不重要)。我想处理2种情景:春季数据休息处理无效字段HandleBeforeSave

  1. 看跌密码场实际上应该更新其中一个提供
  2. PUT没有密码字段应该保留密码完好无损的密码。

尽管第一种情况正常,但我找不到另一种解决方案。我试过这样的事件处理程序

@HandleBeforeSave 
    fun handleUserUpdate(user: User) { 
     if (user.password == null || user.password == "") { 
      val storedUser = systemRunner.runInSystemContext { userRepository.findOne(user.id!!) } 
      user.password = storedUser.password 
     } else { 
      user.password = passwordEncoder.encode(user.password) 
     } 
    } 

但是这不行。 Spring DATA REST已经在所提供的参数中删除了字段(并且它处于相同的JPA会话中,所以显然我从DB获得了相同的结果)。我可能可以请求刷新实体,但是我会放弃其他更改?这个怎么做?

+0

对于部分更新使用PATCH https://docs.spring.io/spring-data/rest/docs/current/reference/html/#_patch并没有投入。 https://docs.spring.io/spring-data/rest/docs/current/reference/html/#_put –

回答

0

真奇怪......在我的Java项目都按预期工作,既为PUT和PATCH请求:

@Component 
@RepositoryEventHandler(User.class) 
public class UserEventHandler { 

    @HandleBeforeSave 
    public void handleBeforeSave(User user) { // user: "User[id:1]" 
     //... 
    } 
} 

但是关于在User类编码的密码是什么?例如:

@Entity 
public class User { 

    public static final PasswordEncoder ENCODER = new BCryptPasswordEncoder(); 

    //... 

    @PreUpdate 
    @PrePersist 
    private void encodePassword() { 
     password = !StringUtils.isEmpty(password) ? ENCODER.encode(password) : null; 
    } 
} 

在我看来这个解决方案是更好的原因简化版,它依赖于REST层上...

+0

但我的问题是如何使春天不是空字段不存在,但让它们保持完好? – kboom

0

其实我发现anwser。请使用标准内容类型json的补丁或“application/merge-patch + json”。请按照RFC specification其中指出,为空出F字段和更新领域中

{ 
     "a": "b", 
     "c": { 
      "d": "e", 
      "f": "g" 
     } 
} 

你需要打补丁“的应用程序/合并补丁+ JSON”

 { 
     "a":"z", 
     "c": { 
      "f": null 
     } 
     } 

或者你的价值“Z”可以做这样的事情

@Transient 
    var oldPassword: String? = null 

    @PostLoad 
    fun rememberOldUser() { 
     this.oldPassword = this.password; 
    }