我有一个User域类,其中包含一个名为Gender的枚举字段。它具有男性和女性的价值。当我在GSP页面上表示它时,它显示为下拉列表。为了测试Web应用程序的安全性,我使用firebug来改变0到abc的男性值,看看验证是否捕获了它。我这样做,但它显示的信息不是人类可读的。我在messages.properties中使用了以下内容。
typeMismatch.User.gender=The value for {0} is {1} and it is not a valid value
但问题是,当我的GSP呈现错误时,它不会将{1}替换为下拉列表的被拒绝值。我试过{2}和{3}等等,它只将它们打印成String并且不替换它们。有没有办法在邮件中获取被拒绝的值?
更新:我的enum性别也有toString方法。这是来自controller和gsp页面的一些代码。
控制器:
if (bioInstance.hasErrors() || currentUser.hasErrors()) {
render(view: 'editProfile', model: [user: currentUser, bioInstance: bioInstance])
return
}
GSP:
<g:hasErrors beans="[bioInstance:Bio,user:User]">
<ul class="alert alert-danger">
<g:renderErrors beans="[bioInstance:Bio,user:User]" as="list"/>
</ul>
</g:hasErrors>
答案 0 :(得分:0)
这是因为grails通过消息(error:someError)方法呈现错误消息。 someError 是 org.springframework.validation.FieldError 的一个实例,它是在验证阶段创建的,它的消息只有一个参数 - 域类本身的名称。所以,这是一个绑定错误,而不是验证错误,默认情况下有3个参数:属性名称,域类名称和拒绝值。
如果你使用的是grails 2.3及以上版本 - 你可以按http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding所述编写自定义绑定器。或者在域类中使用整数字段,为它写一些约束,并通过getter作为枚举将它暴露给外部。