Grails域自定义错误消息

Grails域自定义错误消息,grails,dns,Grails,Dns,我在一个grails应用程序中工作,我在应用程序中有许多域,超过50个!生成的错误消息是默认的,我的message.properties文件中有以下内容 default.blank.message=Field "{0}" cannot be blank. person.maritialStatus=Maritial Status 我的一个域类示例如下所示: class Person { String firstName; String lastName; Strin

我在一个grails应用程序中工作,我在应用程序中有许多域,超过50个!生成的错误消息是默认的,我的message.properties文件中有以下内容

default.blank.message=Field "{0}" cannot be blank.
person.maritialStatus=Maritial Status
我的一个域类示例如下所示:

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文件中添加了以下内容

default.blank.message=Field "{0}" cannot be blank.
person.maritialStatus=Maritial Status

但我仍然收到“maritialStatus”字段不能为空的消息。我还尝试使用I18n模板插件,但由于我有很多域类,修改所有这些类的错误消息将非常耗时。那么,我有什么选择,或者我做错了什么。非常感谢您的帮助。

参考页上为每种约束类型指定了要覆盖的适当消息键。如果是

但是,如果您有许多域和许多属性,这将非常耗时和重复

您要求的是在将域类属性名称插入默认消息之前,以某种方式处理它们。这不是Grails开箱即用的支持,但我喜欢挑战。。。我发现了一种非常优雅的方法来实现它。我的方法是在上提供的grails插件,它通过扩展格式字符串语法来支持表单的占位符

default.blank.message=Field "{0,message,field.name.}" cannot be blank.
占位符
{N,message,prefix}
的解析方法是将给定的前缀前置到通常的占位符替换值,然后将生成的字符串(
field.name.maritalStatus
在本例中)视为无参数消息键,并以通常的方式进行查找。因此,对于不同的语言,可以有不同的表示

它必须是一个插件,因为它依赖于一个技巧,该技巧在插件的
doWithSpring
中有效,但在应用程序的
资源.groovy
中无效,以修改默认
messageSource
springbean的定义


免责声明:这是一个快速解决方案,尚未经过全面测试,可能可以更有效地实施。

参考页上为每种约束类型指定了要覆盖的适当消息键。如果是

但是,如果您有许多域和许多属性,这将非常耗时和重复

您要求的是在将域类属性名称插入默认消息之前,以某种方式处理它们。这不是Grails开箱即用的支持,但我喜欢挑战。。。我发现了一种非常优雅的方法来实现它。我的方法是在上提供的grails插件,它通过扩展格式字符串语法来支持表单的占位符

default.blank.message=Field "{0,message,field.name.}" cannot be blank.
占位符
{N,message,prefix}
的解析方法是将给定的前缀前置到通常的占位符替换值,然后将生成的字符串(
field.name.maritalStatus
在本例中)视为无参数消息键,并以通常的方式进行查找。因此,对于不同的语言,可以有不同的表示

它必须是一个插件,因为它依赖于一个技巧,该技巧在插件的
doWithSpring
中有效,但在应用程序的
资源.groovy
中无效,以修改默认
messageSource
springbean的定义


免责声明:这是一个快速解决方案,尚未经过全面测试,可能可以更有效地实施。

要覆盖字段标签,您需要覆盖密钥:

<package>.<domainclass>.<fieldname>.label
…标签
因此,在您的情况下,请尝试:

<package>.Person.martialStatus.label=Label
.Person.martialStatus.label=label

要覆盖字段标签,需要覆盖键:

<package>.<domainclass>.<fieldname>.label
…标签
因此,在您的情况下,请尝试:

<package>.Person.martialStatus.label=Label
.Person.martialStatus.label=label

我知道,对所有域的所有字段执行此操作可能需要很长时间。我只是想重命名默认错误消息中的字段名。好的,我知道你现在得到了什么。本机不支持它,但我找到了一种将其作为插件实现的方法-请参阅编辑的答案。感谢您的回复,我尝试了它,但它不起作用,我可能做错了什么。我知道,对所有域的所有字段执行此操作可能需要很长时间。我只是想重命名默认错误消息中的字段名。好的,我知道你现在得到了什么。本机不支持它,但我找到了一种将其作为插件实现的方法-请参阅编辑的答案。感谢回复,我尝试了它,但它不起作用,我可能做错了什么。