缺少Domain构造函数的瞬态属性(带有映射参数)

时间:2015-04-16 05:21:40

标签: grails gorm

在域类上使用地图自动创建不会填充瞬态属性:

class Address {
  String street
  String number
  static transients = ["number"]
}

def address = new Address(street: "King's Street", number: "23")
println address.street //King's Street
println address.number //null

有什么好的理由吗? Grails域实例化会覆盖默认的Groovy行为吗?

2 个答案:

答案 0 :(得分:2)

你可以双向完成。

  1. 如果你想使一个字段成为瞬态,你需要绑定它。

    class Address {
    String street
    String number
    
    static constraints = {
        number bindable: true, nullable:true
    }
    static transients = ['number']
    }
    
  2. 您可以使用一些getter方法绑定它。

    class Address {
    
    String street
    String number
    
    String getDifferentNumber() { number }
    
    static transients = ['differentNumber']
    }
    
  3. 希望它会对你有所帮助。享受。

答案 1 :(得分:1)

  

有什么好的理由吗?

是。这是自Grails 2.0.2以来的行为。默认情况下不可绑定的属性是与瞬态字段,动态类型属性和静态属性相关的属性。在https://spring.io/blog/2012/03/28/secure-data-binding-with-grails进行了一些讨论。

  

Grails域实例化会覆盖默认的Groovy行为吗?

是。这允许在Web应用程序中执行许多常见操作,例如将请求参数绑定到域实例,从而允许将一堆字符串(请求参数)绑定到对象图形所需的大量灵活性。

如果你真的想要绑定到一个瞬态属性,你所要做的就是将属性配置为可绑定:

class Address {
    String street
    String number
    static transients = ["number"]

    static constraints = {
        number bindable: true
    }
}

请参阅http://grails.github.io/grails-doc/2.4.5/ref/Constraints/bindable.html

我希望有所帮助。