Grails瞬态属性未在对象创建时获取

时间:2012-07-02 16:14:45

标签: grails grails-domain-class grails-2.0

从Grails 1.3.7迁移到2.0.4后,我发现我的一个域类存在问题,我使用临时属性来处理密码。

我的域类看起来像这样(简化):

   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中,这曾经在我的Bootstrap中工作:

    def user1= new User (email: "test@test.com", password1: "123456", password2: "123456")
    user1.save()

但是,在Grails 2.0.x中,这将导致错误,指出password1和password2都为null。 如果我尝试这样做,我的控制器会发生同样的事情:

    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中使用的瞬态变得无效,或者这可能是某种框架错误吗?

2 个答案:

答案 0 :(得分:15)

出于安全考虑,瞬态不再是自动绑​​定的。但是您可以通过添加“可绑定”约束来轻松地使其工作(请参阅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 ->

答案 1 :(得分:3)

我认为作为grails 2.x中数据绑定改进的一部分 - 它不会绑定瞬态属性。