4

我有一堂课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

我有两个问题:

  1. linkText就在形式中,在<g:textField>with 中name="linkText"。为什么它不受约束itemInstance?如果我在 a之前打印出参数,我会save()得到它们,包括 我可以将我的保存代码更改为linkTextitemInstancelinkTextnull

    def itemInstance = new Item(params)
    itemInstance.linkText = params.linkText
    

    它将被保存而没有任何问题和使用params.linkText。但为什么我必须这样做?现在是linkText保留关键字还是什么?(我只知道那不是在 2008 年。)

  2. 为什么我收到“可空”错误而不是“空白”错误?它们是不同的错误。我messages.properties为此有一条自定义消息,但即使 Grails 现在不想使用它,我希望它会给我它的default.blank.message(“<code>Property [{0}] of class [{1}]不能是空白的”)。

该列表中的第一名对我来说是最令人担忧的,但我真的不明白为什么 Grails 一开始就将这个领域与其他三个领域有任何不同Strings

4

2 回答 2

1

我相信#2正在发生,因为:

  • “默认情况下,所有域类属性都不可为空(即它们具有隐式可空:假约束)。” (引自Grails 验证文档)。
  • 我怀疑按照验证的顺序,grails首先检查属性的可空性约束。(但需要验证这一点)

我怀疑这些是您获得空约束而不是空白约束的原因。我相信如果您将 linkText 属性设置为可为空:true,那么您将开始收到空白约束的错误消息。现在我尝试了这个,它的行为不像我期望的那样。

对于以下域类:

class Item {
  String linkText

  static constraints = {
    linkText nullable: true, blank: false
}

并尝试像这样保存它:

def item= new Item(linkText: "")
item.save()

Grails 很乐意将项目保存为空白值。但是,如果我取出 nullable: true 约束,它会抱怨空白值。

于 2013-03-03T01:41:18.670 回答
1

正如评论中提到的,我在一个新项目中尝试了这个,但无法重现该问题。

对于#1:我会尝试一些不同的事情:

  1. 包含所有键/值对(不是参数的克隆)的新映射,并尝试使用此自定义映射实例化我的项目。只是为了确认是域/约束还是导致意外行为的参数映射。
  2. 参数的克隆,然后将其用于实例化。

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

于 2013-03-05T06:09:41.243 回答