Grails自定义验证消息不起作用?

时间:2012-11-08 11:38:05

标签: validation grails messages

我目前正在处理Grails应用程序,并且我想更改为我的域模型中的对象显示的默认错误消息。我相信我已经做了一切正确但也许有人可以帮我解决这个问题,代码如下:

域名模型:

class Details {

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

messages.properties

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"

有人可以帮我生成自定义消息进行验证,以便向用户显示有用的消息吗?感谢

2 个答案:

答案 0 :(得分:2)

问题是,在验证之前,绑定会尝试将您的值'gg'绑定到long。

你的约束也说:

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

因此你希望它是一个字符串,但它被定义为long。

尝试将您的mobileNo更改为String类型。

答案 1 :(得分:0)

更深入地查看堆栈跟踪,它可能会告诉您抛出错误的行号。我的猜测是它在下一行抛出异常......

new Details(params)

这是因为你没有在grails尝试将'gg'转换为long之前检查输入,这将无效。在我看来,你有四种选择......

  1. 将mobileNo更改为字符串
  2. 在执行params(不推荐)
  3. 之前验证new Details(params)
  4. 使用javascript / jquery仅允许输入中的数值。
  5. 我记得那里有一些额外的插件可以添加到grails进行远程验证或类似的东西,但我不记得它们在我的头顶。但是,我只是使用jquery(或其他)构建我自己的。
  6. 享受!