2012-07-02 80 views
11

從Grails 1.3.7遷移到2.0.4後,我注意到我的一個域類中存在一個問題,我使用瞬態屬性來處理密碼。在創建對象時未拾取Grails瞬態屬性

我的領域類看起來像這樣(簡化):

package test 

    class User { 
String email 
String password1 
String password2 
//ShiroUser shiroUser 

static constraints = { 
    email(email:true, nullable:false, unique:true) 
    password1(nullable:true,size:5..30, blank: false, validator: {password, obj -> 

     if(password==null && !obj.properties['id']){ 
      return ['no.password'] 
     } 
     else return true 
     }) 
    password2(nullable:true, blank: false, validator: {password, obj -> 
     def password1 = obj.properties['password1'] 

     if(password == null && !obj.properties['id']){ 
      return ['no.password'] 
     } 
     else{ 
      password == password1 ? true : ['invalid.matching.passwords'] 
     } 
     }) 

} 
static transients = ['password1','password2'] 
    } 

在1.3.7這個曾經在我的引導工作:

def user1= new User (email: "[email protected]", password1: "123456", password2: "123456") 
    user1.save() 

然而,在Grails的2.0.x版本,這將導致錯誤地指出password1和password2都是空的。 同樣的事情發生在我的控制器,如果我嘗試做:

def user2= new User (params)// params include email,password1 and password2 

爲了使其工作,我必須做以下解決方法:

def user2= new User (params)// params include email,password1 and password2 
    user2.password1=params.password1 
    user2.password2=params.password2 
    user2.save() 

這是相當難看 - 和討厭。

任何人都可以說如果我的過渡使用在grails 2.x中變得無效,或者這可能是某種框架錯誤?

回答

14

出於安全原因瞬變不再自動綁定。但是你可以很容易地使通過在「綁定」約束(見http://grails.org/doc/latest/ref/Constraints/bindable.html)加入工作。更改

password2(nullable:true, blank: false, validator: {password, obj -> 

password2(bindable: true, nullable:true, blank: false, validator: {password, obj -> 
+0

感謝伯特 - 使這個安全相關的變化感好。只是沒有意識到(新的)可綁定約束。 –

+1

嘿伯特,這是在2.1.0改變?我有一個完全相同的場景,對我們來說,「cnfPassword」仍然爲空!不想爲相同的問題打開一個新的線程:) – Sap

+2

嗨,Burt,它在grails中無法正常工作2.4.3。有沒有其他解決方案可以提供建議? – daimon

3

我覺得作爲數據Grails的2.X結合改進的一部分 - 它不會綁定瞬態特性。

+1

是有一個替代辦法做到這一點呢? – sttaq