命令对象验证奇怪的行为

时间:2014-09-02 09:19:04

标签: grails gorm grails-2.0

我有以下命令类:

class BookmakerCommand {
    Bookmaker bookmaker
    CommonsMultipartFile logotype

        logotype validator: { val, obj ->
            def logoImage = ImageIO.read(val.getInputStream())
            if (logoImage.width > 500 || logoImage.height > 500) {
                obj.errors.reject('logotype.invalid', 'bookmaker.logo.invalid.format')
            }
        }
}

其中标识是图像。正如您所看到的,如果宽度或高度具有无效大小,则应拒绝标识字段。我希望此错误出现在页面顶部并为此目的使用此类构造:

    <g:hasErrors bean="${command}">
        <ul class="errors" role="alert">
            <g:eachError bean="${command}" var="error">
                <li <g:if test="${error in org.springframework.validation.FieldError}">data-field-id="${error.field}"</g:if>><g:message error="${error}"/></li>
            </g:eachError>
        </ul>
    </g:hasErrors>

如果某些博彩公司的字段无效,则此构造会显示相应的错误,但在标识无效时则不会出现相应的错误。我试图调试并发现这一行:

obj.errors.reject('logotype.invalid', 'bookmaker.logo.invalid.format')

实际上不会向命令对象添加错误,因为错误仍然有0大小。我做错了什么? 谢谢!

更新:

我又沉迷了一次,发现我对这条线路并不完全正确:

obj.errors.reject('logotype.invalid', 'bookmaker.logo.invalid.format')
验证器代码中的

调试显示此行将相应的错误添加到命令对象,但在退出验证器代码并返回控制器后错误消失。所以我从这段代码开始调试:

   if (!command.validate()) {
       ...
      }

debug转到验证码:

logotype validator: { val, obj ->
                def logoImage = ImageIO.read(val.getInputStream())
                if (logoImage.width > 500 || logoImage.height > 500) {
                    obj.errors.reject('logotype.invalid', 'bookmaker.logo.invalid.format')
                }
            }

之后obj(这是命令对象)包含错误('bookmaker.logo.invalid.format'),但是当调试继续并转到

   if (!command.validate()) {
       >> HERE
      }

command.errors再次变空。 很奇怪: - (

1 个答案:

答案 0 :(得分:2)

我想,你不应该在你的验证器中调用errors.reject()。相反,您必须返回false或错误代码:

logotype validator: { val, obj ->
   def logoImage = ImageIO.read(val.getInputStream())
   logoImage.width > 500 || logoImage.height > 500 ? 'bookmaker.logo.invalid.format' : true
}