【问题标题】:Grails command object temporary field validationGrails 命令对象临时字段验证
【发布时间】:2013-10-10 09:49:00
【问题描述】:

我有一个用户注册表单,其中的字段使用命令对象进行验证。其中一个字段是一个复选框,在继续注册之前必须选中它,并且它不会保存到域对象中。此复选框在命令对象中有一个对应的布尔字段。未选中复选框时,自定义验证器会引发验证错误。

问题是,这个错误没有在<g:renderErrors bean="${command}" as="xml"/> 块中传播(验证器被正确触发)。

命令对象:

class RegisterCommand {

...
Boolean termsChecked
...
static constraints = {
    ...
    termsChecked validator: RegisterController.termsCheckedValidator
}

验证器:

static final termsCheckedValidator = {termsChecked, command, errors ->
    if (!command.termsChecked) {
        return 'registerCommand.termsChecked.required'
    }
}

GSP 文件中的复选框:

<g:checkBox value="${command.termsChecked}" bean="${command}" name='termsChecked'/>

如何解决?

【问题讨论】:

  • 验证器在RegisterController 中是否如您所展示和使用的那样?
  • @dmahapatro,是的。验证正确通过,但错误消息永远不会返回到视图。

标签: validation grails command-objects


【解决方案1】:

如果您将 3 个参数传递给验证器,最后一个参数是 errors,则返回代码将被忽略,认为 Spring 错误正在处理错误。

如果您想使用错误代码,则只需将 2 参数传递给验证器

static final termsCheckedValidator = {termsChecked, command ->
    if (!command.termsChecked) {
        return ['required.termsChecked']
    }
}


//messages.properties
registerCommand.termsChecked.required.termsChecked=blah

【讨论】:

  • 感谢您的回复。我删除了errors 变量,现在在提交表单后我收到以下消息:URI /projectName/register/register Class groovy.lang.MissingMethodException Message No signature of method: static org.apache.commons.lang.StringEscapeUtils.escapeXml() is applicable for argument types: (java.lang.Boolean) values: [false] Possible solutions: escapeXml(java.lang.String), escapeXml(java.io.Writer, java.lang.String), escapeHtml(java.lang.String), escapeSql(java.lang.String) 编辑:list 格式的错误工作正常,但我需要它们在 xml 中。
  • @cNduo 尝试不同的消息密钥。另请注意以list 返回。查看我的更新。
  • 您的更新确实解决了问题,但前提是错误输出格式为listxml 格式呢?因为我仍然收到与第一条评论相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多