我有以下命令类:
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再次变空。 很奇怪: - (
答案 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
}