自定义错误消息的 Grails 问题

Posted

技术标签:

【中文标题】自定义错误消息的 Grails 问题【英文标题】:Grails Problem with custom error messages 【发布时间】:2011-03-16 02:33:30 【问题描述】:

我目前正在尝试在 grails 中为默认约束指定自定义错误消息,但到目前为止我得到的只是默认错误消息。

我知道我必须编辑 grails-app/i18n/messages.properties 文件

如果我更改以下默认错误代码消息,它将正确显示新的错误消息

default.blank.message=Property [0] of class [1] cannot be blank

但是,这不是我想要做的。我需要更精细的错误报告,并且有多个可以为空白的字段等。我希望能够为类中的每个字段显示自定义消息

package com.mycompany.myapp

class Test

 String name
 def constraints = 
 name(nullable:false, blank:false)
 

(在 messages.properties 末尾附加以下代码)

test.name.blank=Name cannot be blank
test.name.nullable=Name cannot be nullable

根据 grails 文档,这应该可以正常工作,无论有没有包名 - className.propertyName.blank

grails.org/doc/latest/(约束部分)和(第 7.4 节 - 验证和国际化)

我已经尝试了所有我能想到的组合,但它总是显示自定义消息

我也试过安装 grails i18n 模板插件

http://www.grails.org/I18n+Templates+Plugin

它会自动为我生成错误代码。我将新的错误代码附加到现有 messages.properties 文件的末尾,但我仍然收到默认错误消息。

但是,插件生成的错误代码有所不同。

而不是grails文档中指定的格式——test.name.null=......,它自动生成了test.name.null.error=Custom Message

我也尝试过完全删除默认错误消息,但它们仍然显示

如果有人之前遇到过这个问题,我将不胜感激任何人都可以给我的帮助

提前致谢

【问题讨论】:

我已经创建了关于如何创建自定义验证并将自定义错误消息发布回您的视图的详细答案:***.com/questions/14038905/… 会让 int test.name.blank.message 永远改变什么吗? 这拯救了我的一天:((MessageSource) Holders.getGrailsApplication().getMainContext().getBean("mes‌​sageSource")).getMes‌​sage(e.getErrors().g‌​etAllErrors().get(0)‌​, LocaleContextHolder.getLocale()); 【参考方案1】:

将 def messageSource (在控制器或服务中)

item.errors?.allErrors?.each 
println  messageSource.getMessage(it, null)
;

我还找到了一个很好的链接,可以更好地解释这一点

http://johnrellis.blogspot.com/2010/02/retrieve-grails-domain-errors-from.html

【讨论】:

println message(error: it) 似乎对我来说更好一些。链接博客的cmets中引用了这个快捷方式。【参考方案2】:

好吧,文档向您展示了如何覆盖默认验证约束(空白、可空、最小值、最大值、大小、范围等)之一的消息的示例。但它没有告诉您查看每个约束的文档,并在底部显示了要使用的属性键:

错误代码:className.propertyName.size.toosmallclassName.propertyName.size.toobig

对于约束大小 http://grails.org/doc/latest/ref/Constraints/size.html

所以,对于

package com.example
class User 
    String username

    static constraints = 
        username  size:5..15
    

使用:

com.example.User.username.size.toosmall=喂!太小:值为 [2] 的类 [1] 的 [0] 不在 [3] 到 [4] 的有效大小范围内

com.example.User.username.size.toobig=喂!太大:值为 [2] 的类 [1] 的 [0] 不在 [3] 到 [4] 的有效大小范围内

【讨论】:

你是我的朋友。上帝禁止他们在用户指南中记录任何这些内容。【参考方案3】:

可能是您的约束不是静态的 - 它应该被指定为“静态约束 = ...”

另请注意,可空值默认为 false,因此您无需指定。

【讨论】:

抱歉,上面的例子有误。我实际上在我的真实代码中使用静态约束。感谢可为空的信息更新的示例将是 package com.mycompany.myapp class Test String name static constraints = name(blank:false) 【参考方案4】:

我在我的 messages.properties 中使用完全限定的类名

com.shareyourlove.User.password.blank=Some custom message

【讨论】:

感谢您的建议,我已经尝试过这个以及我能想到的任何组合。 grails 文档(第 7.4 节)还指定“在有包和没有包的情况下查找类名,打包的版本优先。”因此,如果文档是正确的,则是否指定类名都无关紧要。 i18n 插件也会生成不带包名的错误代码,但格式如下: test.name.blank.error=Name cannot be blank 我已经设法创建了一个使用脚手架的新应用程序并将自定义错误消息返回到 Web 界面,但是,写入控制台/错误日志的错误消息仍然显示默认错误消息。而且我仍然不确定我现有的应用程序有什么问题【参考方案5】:

这对我有用

com.model.Customer.name.nullable.error = Custom message

而不是

com.model.Customer.name.blank = Custom message

【讨论】:

以上是关于自定义错误消息的 Grails 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用服务和插件依赖项测试自定义 Grails Taglib

显示 Grails 字段错误

如何覆盖 Grails 中的默认错误消息?

使用 grails 2.2.0 和资源插件找不到自定义 jquery css 图像

如何自定义 Grails Spring Security REST 登录响应 HTTP 代码

Grails - Acegi:自定义身份验证方法