Grails-使域类中的嵌入字段为空

Grails-使域类中的嵌入字段为空,grails,gorm,Grails,Gorm,如何将嵌入字段指定为可空?在下面的简单示例中,如果没有与项目关联的价格,我希望字段price可以为null。但是,如果有价格,则货币中的两个字段都是必需的。以下代码不起作用。当我试图保存项目时,它会抱怨货币字段的值为空 class Item { static constraints = { price(nullable:true) } static embedded = ['price'] Currency price } class Currency { Int

如何将嵌入字段指定为可空?在下面的简单示例中,如果没有与项目关联的价格,我希望字段price可以为null。但是,如果有价格,则货币中的两个字段都是必需的。以下代码不起作用。当我试图保存项目时,它会抱怨货币字段的值为空

 class Item {
  static constraints = {
    price(nullable:true)
  }
  static embedded = ['price']
  Currency price
}

class Currency {
  Integer quantity
  String currencyType
}

只需在嵌入对象中定义一个
静态约束

class Currency {
...
    static constraints = {
        quantity(nullable:true)
        currencyType(nullable:true,validator:{ String val, Currency obj -> 
            if ((val && !obj.quantity) || (!val && obj.quantity)) {
                return 'Currency.both.fields.required';
            }
        })
    }
}

然后,只需将Currency.both.fields.required添加到您的
messages.properties
,以显示相应的错误。

这不是我想要的。这将允许我没有货币,但也将允许我有一种货币类型为currencyType,没有数量,或者数量类型为currencyType。因此,这不符合我希望约束施加的业务规则。此时,您可以添加一个自定义验证器来验证这两个字段是否已设置。我已经更新了我的回复,以展示如何做到这一点。是的,这会奏效。谢谢我只希望原始代码能够工作。看起来更漂亮。