2013-02-11 44 views
0

我有3場一組域對象 - 用戶名,密碼和電子郵件地址 來保存對象之前,我模糊的電子郵件地址,以便它不是存儲在純在我們的數據庫作爲它的一個業務需求的Grails 2.2.0 - 驗證問題

我注意到當我打電話驗證域對象的一些奇怪的行爲。是 的領域約束如下

userName (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", matches: "[a-zA-Z0-9, [email protected]#~{}!£%&*^()-_]+") 
    password (nullable: false, unique: false,blank: false, size: 4..200,widget: "textField", password: true, matches: "[a-zA-Z0-9, [email protected]#~{}!£%&*^()-_]+") 
    emailAddress (nullable: false, unique: false,blank: false, size: 5..200,widget: "textField",email: true, matches: "[a-zA-Z0-9, [email protected]#~{}!£%&*^()-_]+") 

爲對象,我對其進行驗證以確保按預期的所有值(EMAILADDRESS尚未混淆) 如果有效我模糊的電子郵件地址,然後調用保存驗證的值:false

奇怪行爲如下 如果我填寫有效的電子郵件地址和有效的密碼 - 對象上的用戶名現場驗證失敗,因爲它不能爲空

如果我填在有效的電子郵件地址中和一個有效的用戶名 - 該對象無法驗證密碼字段,因爲它不能爲空,也在電子郵件地址,它顯示郵件中的電子郵件地址的模糊值

我首先想到混淆導致問題,但它在輸入密碼字段的情況下工作正常 兩種情況下的代碼流完全相同。

難道Grails是呼籲在密碼字段是不是在後,我模糊的電子郵件地址填寫場景的驗證方法?

代碼流程如下

 def userLoginUserInstance = UserLoginUser.get(params.id) 
     userLoginUserInstance.properties = params 

     if (userLoginUserInstance.validate()) { 
      //perform updates to database by obfuscating email address first - working fine 
     } else { 
       def newObfuscatedEmailAddress = userLoginUserInstance.emailAddress.encodeAsBase64(); 

       userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress); 

       render(view: "edit", model: [userLoginUserInstance: userLoginUserInstance]) 
     } 

驗證失敗時是,GSP讀取其具有吸氣劑比deObfuscates的電子郵件地址的瞬時變量的電子郵件地址進行模糊處理的原因。當上面的代碼在沒有設置用戶名的情況下運行時,它工作正常,並且電子郵件地址顯示爲正常。 如果密碼爲空,則會顯示密碼錯誤,但是模糊的電子郵件地址會顯示爲無效。

在進一步分析,當我運行的代碼

userLoginUserInstance.setEmailAddress(newObfuscatedEmailAddress); 

我明白爲什麼作爲userLoginUserInstance從數據庫中檢索發生這種情況下面一行驗證問題發生。 什麼讓我困惑的是,這並不在所有情況下

+0

向我們展示你如何混淆 – Chris 2013-02-11 15:56:34

+0

我改變我的混淆只是對電子郵件地址進行編碼,當我這樣做時,問題仍然存在。 – Damien 2013-02-11 16:07:12

+0

請澄清錯誤情況 – Chris 2013-02-11 16:17:28

回答

0

對不起,不又回到了這個快

我解決了這個從數據庫 傳遞一個新的對象返回到視圖,而不是對象,因爲我有一個要求混淆的電子郵件地址,它確實過於複雜這種使用情況

感謝您的幫助,這一個傢伙

問候 達明

1

驗證錯誤發生,因爲你正嘗試將Base64字符串存儲到一具有電子郵件約束屬性發生:

"[email protected]bar.com".encodeAsBase64() 

結果

Zm9vQGJhci5jb20= 

當你User實體刷新到數據庫再次當然另一個驗證正在發生的事情,抱怨說這是沒有有效的電子郵件地址,所以現在。

原因,爲什麼在所有情況下都不會引發驗證錯誤,您不強制執行user.save()user.save(flush:true)

這意味着電子郵件地址不會更新ad-hock,但會在一段時間後更新。要更好地瞭解發生了什麼,在分配電子郵件後添加另一個驗證塊。