我有一个Item类:

class Item {
  String title
  String description
  String linkText
  String linkUrl

  static constraints = {
    title blank: false
    description blank: false
    linkText blank: false
    linkUrl blank: false, url: true
}

当我尝试使用保存新的Item实例时
def itemInstance = new Item(params)
itemInstance.save()

我收到验证错误:
Property [linkText] of class [class Item] cannot be null

我对此有两个问题:
  • linkText就在表单中,即带有<g:textField>name="linkText"中。为什么不将它绑定(bind)到itemInstance?如果我在save()之前打印出这些参数,那么我会得到所有信息,包括linkText,但是如果我从这些参数构造出预先保存的itemInstance的属性后将其打印出来,则实例上的linkTextnull。我可以将保存代码更改为
    def itemInstance = new Item(params)
    itemInstance.linkText = params.linkText
    

    它将被保存,没有任何问题,并使用params.linkText。但是我为什么要这样做呢? linkText现在是保留关键字还是其他? (我只知道it wasn’t in 2008。)
  • 为什么我会收到“可为空”的错误,而不是“空白”的错误?它们是不同的错误。为此,我在messages.properties中有一条自定义消息,但是即使考虑到Grails现在不想使用它,我也希望它会给我它的default.blank.message(“Property [{0}] of class [{1}] cannot be blank”)。

  • 该列表上的第一名是我最关心的问题,但我真的不明白为什么Grails将此字段与该类中所有其他三个Strings区别对待。

    最佳答案

    如评论中所述,我在一个新项目中尝试了此操作,无法重现该问题。

    对于#1:我会尝试几种不同的方法:

  • 一个具有所有键/值对的新映射(不是参数的克隆),并尝试使用此自定义映射实例化我的Item。只是要确定是引起意外行为的是域/约束还是参数映射。
  • params的克隆,然后将其用于实例化。

  • 如果在两种情况下都能正常工作,那么我将仔细查看我的实际参数图,并将其与正常工作的克隆进行比较。

    10-06 06:05