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

Posted

技术标签:

【中文标题】Grails 瞬态属性未在对象创建时获取【英文标题】:Grails transient properties not picked up on object creation 【发布时间】:2012-07-03 02:05:53 【问题描述】:

从 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 都为空。 如果我尝试这样做,我的控制器也会发生同样的事情:

    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 中是否无效,或者这可能是某种框架错误?

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢 Burt - 这个与安全相关的更改很有意义。只是不知道(新的?)“可绑定”约束。 嘿Burt,这是在2.1.0 中改变的吗?我有一个完全相同的场景,对我们来说“cnfPassword”仍然为空!不想为同一个问题打开一个新线程:) 嗨,Burt,它在 grails 2.4.3 中无法正常工作。您可以提供任何替代解决方案吗? 这在 Grails 2.3.9 中似乎不起作用。如果属性是瞬态的,则 bindable: true 不会使其绑定。【参考方案2】:

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

【讨论】:

那么还有其他方法吗?

以上是关于Grails 瞬态属性未在对象创建时获取的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 非空属性引用空值或瞬态值

CoreData 中的瞬态属性

Grails Gorm:Object引用未保存的瞬态实例

Grails - 非空属性仅对并发用户引用空值或瞬态值错误

基于瞬态属性获取的结果控制器 sectionIndexTitle

Grails 2.2.4:瞬态属性:为啥自定义验证器被调用两次?