0

現在、Grails アプリケーションに取り組んでおり、ドメイン モデル内のオブジェクトに対して表示されるデフォルトのエラー メッセージを変更したいと考えています。私はすべて正しいことをしたと信じていますが、誰かがこの問題を解決するのを手伝ってくれるかもしれません.以下のコード:

ドメイン モデル:

class Details {

    long mobileNo
    String name
    static constraints = {
    mobileNo(blank:false, maxsize:12, matches:"44[0-9]{10}")
    }
}

メッセージのプロパティ

sms.mobileNo.matches.invalid=You must enter a correct mobile number in {0}

意見

<g:hasErrors bean="${detailsInstance}">
    <div class="alert error">
        <g:renderErrors bean="${detailsInstance}" as="list" />
    </div>
</g:hasErrors>

ページで作成をクリックすると、次のコントローラー関数に移動します。

def details = new Details(params)

        if (details.validate()) {

}
else{
            render view: 'create', model: [detailsInstance: details]

        }

ここで、アプリケーションは次のように動作することを期待します。間違ったデータがコントローラーに渡されると、コントローラーはそれが有効でないと見なし、エラーのあるモデルを同じビューに戻します。次に、 messages.propertiesファイルからデータが正しくないエラー メッセージが取得されます。ただし、これが表示されると予想される場所:

You must enter a correct mobile number in [mobileNo]

私は代わりにこれを見ます:

Failed to convert property value of type java.lang.String to required type long for property mobileNo; nested exception is java.lang.IllegalArgumentException: Could not parse number: Unparseable number: "gg"

ユーザーに役立つメッセージを表示するために、検証用のカスタム メッセージを生成するのを手伝ってもらえますか? ありがとう

4

2 に答える 2

2

問題は、検証の前に、バインディングが値「gg」を long にバインドしようとすることです。

あなたの制約も言います:

mobileNo(blank:false, maxsize:12, matches:"44[0-9]{10}"

したがって、文字列であると予想されますが、long として定義されています。

mobileNo を String 型に変更してみてください。

于 2012-11-08T13:17:59.060 に答える
0

スタックトレースをもう少し詳しく調べると、おそらくエラーがスローされている行番号がわかります。私の推測では、次の行で例外がスローされています...

new Details(params)

これは、grails が 'gg' を long に変換しようとする前に入力をチェックしていないためです。これは機能しません。私の意見では、ここには 4 つのオプションがあります...

  1. mobileNo を文字列に変更する
  2. params実行する前に検証するnew Details(params)(お勧めしません)
  3. 入力に数値のみを許可するには、javascript/jquery を使用します。
  4. リモート検証などのためにgrailsに追加するプラグがいくつかあることを覚えていますが、頭のてっぺんからそれらを思い出すことはできません。ただし、jquery(またはその他)を使用して独自に構築するだけです。

楽しみ!

于 2012-11-08T13:19:33.547 に答える