2017-08-28 75 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; 
    }