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

Missing transient properties on Domain constructor (with mapped parameters)

在域 类 上使用地图自动创建不会填写临时属性:

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 行为吗?

你可以通过两种方式完成。

  1. 如果要让transient成为一个字段,需要绑定。

    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']
    }
    

希望对您有所帮助。享受吧。

Is there any good reason for that?

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

上有一些关于此的讨论

Grails domain instantiation overrides the default Groovy behaviour?

是的。这允许做一些在网络应用程序中常见的事情,比如以一种允许将一堆字符串(请求参数)绑定到对象图所需的大量灵活性的方式将请求参数绑定到域实例.

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

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

希望对您有所帮助。