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

これには2つの問題があります。

  1. linkTextの形で、そこにあり<g:textField>ますname="linkText"。なぜ拘束されないのitemInstanceですか?の前にパラメータを出力するとsave()、を含むすべてが取得されますが、それらのパラメータから構築したときにlinkText事前に保存されたプロパティのプロパティを出力すると、インスタンスはです。保存コードを次のように変更できますitemInstancelinkTextnull

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

    そしてそれは問題なく保存され、使用されますparams.linkText。しかし、なぜ私はそれをしなければならないのですか?linkText予約キーワードか何か今ですか?(私が知っているのは、2008年ではなかったということだけです。)

  2. 「空白」ではなく「null許容」エラーが発生するのはなぜですか?それらは異なるエラーです。これに関するカスタムメッセージがありますがmessages.properties、Grailsが現在それを使用したくない場合でも、default.blank.message(“ <code> Property [{0}] of class [{1}]空白にすることはできません」)。

そのリストの1番が私にとって最も懸念されていますが、そもそもなぜGrailsがこの分野をStringsクラスの他の3つすべてと異なって扱っているのかわかりません。

4

2 に答える 2

1

私は#2が起こっていると信じています:

  • 「デフォルトでは、すべてのドメインクラスプロパティがnull許容ではありません(つまり、暗黙のnull許容:false制約があります)。」( Grails検証ドキュメントから引用)。
  • 検証の順序で、grailsは最初にnull可能性制約の属性をチェックしていると思います。(ただし、これを確認する必要があります)

これらが、空白ではなくnull制約を取得している理由だと思います。linkTextプロパティをnullable: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. パラメータのクローンを作成し、それをインスタンス化に使用します。

どちらの場合でも問題なく動作する場合は、実際のparamsマップをよく見て、動作しているクローンと比較します。

于 2013-03-05T06:09:41.243 に答える