我正在使用grails应用程序,我在应用程序中有很多域,超过50个!生成的错误消息是默认的,我在message.properties文件中有以下内容
default.blank.message=Field "{0}" cannot be blank.
我的一个域类的示例如下:
class Person {
String firstName;
String lastName;
String middleName;
Date dob;
String gender;
String religion;
String nationality;
String maritalStatus;
Zone permAddZone;
District permAddDistrict;
String permAddVDC;
}
依此类推,所以当我离开一个字段时,例如'maritalStatus'会出现以下错误信息,'Field'maritialStatus“不能为空。”。我还在message.properties文件中添加了以下内容
person.maritialStatus=Maritial Status
但我仍然得到'Field'maritialStatus“不能空白。”信息。我也尝试使用I18n模板插件,但由于我有很多域类,修改所有这些类的错误消息将非常耗时。那么,我有什么选择或者我做错了什么。任何帮助表示赞赏。
答案 0 :(得分:3)
在每个约束类型的参考页面上指定要覆盖的相应消息键。在blank的情况下,它是
com.example.Person.maritalStatus.blank=Marital status must not be blank
但是,如果您有许多域和许多属性,这将非常耗时且重复。
您要求的是在将域类属性名称插入默认消息之前以某种方式处理它们的方法。这不是Grails开箱即用的东西,但我喜欢挑战......而且我发现了一种令人惊讶的优雅方式来实现它。我的方法是https://github.com/ianroberts/recursive-messages提供的grails插件,它的工作原理是扩展格式字符串语法以支持表单的占位符
default.blank.message=Field "{0,message,field.name.}" cannot be blank.
通过将给定前缀添加到通常的占位符替换值,然后将结果字符串(在此示例中为{N,message,prefix}
)视为无参数消息键,并查看该占位符来解析占位符field.name.maritalStatus
以通常的方式。因此,您可以对不同的语言进行不同的表示。
它必须是一个插件,因为它依赖于一个在插件的doWithSpring
中起作用但在应用程序的resources.groovy
中不起作用的技巧,来修改默认的messageSource
的定义春豆。
免责声明:这是一个快速修复,它尚未经过全面测试,可能更有效地实施。
答案 1 :(得分:1)
要覆盖字段标签,您需要覆盖密钥:
<package>.<domainclass>.<fieldname>.label
所以在你的情况下,试试:
<package>.Person.martialStatus.label=Label