我想在字段中添加一个自定义验证器,以便强制执行条件非null约束。由于这个需求在多个对象之间共享,所以我希望重用现有的全局(意味着不是特定于对象或字段的)消息键。在下面的示例中,我希望使用default.null.message
,而不是类似objectA.fieldC.null.message
的内容。
Grails验证器的文档似乎说,可以通过从message.properties返回一个表示密钥的字符串值来发出错误情况的信号
关闭可以返回:
- null或true(或无返回值)表示该值有效
- false表示无效值并使用默认消息代码
- 一个指示要附加到"错误"的错误代码的字符串;classname.propertyName;用于解析错误消息的字符串如果无法解析字段特定的消息,则将解析错误代码本身,从而允许全局错误消息
- 一个列表,其中包含一个如上所述的字符串,然后是它后面的任意数量的参数,这些参数在grails app/i18n/message.properties文件中用作格式化的消息参数。参数的映射如下:参数0到2自动映射到0:属性名、1:类名、2:属性值。从参数3开始映射其他参数
我还发现了一个在1.0中关闭的Grails错误,它似乎要求我做什么
下面是我正在做的一个例子。正如你所看到的,我有一种工作方法,但看起来更干净的前两个选项不起作用,这真的让我很恼火。
class ObjectA {
ObjectB fieldB
ObjectC fieldC
static constraints = {
fieldC(nullable: true, validator: { value, object, errors ->
if (object.fieldB != ObjectB.SOMETHING && !value) {
// Doesn't work
//return "default.null.message"
// Doesn't work
//return ["default.null.message"]
// This works
errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field "{0}" cannot be null")
}
})
}
}
这是我的message.properties
:中的条目
default.null.message=The field "{0}" cannot be null
我在这里看到了一些与带有自定义错误消息的Grails自定义字段验证器有关的问题,但似乎没有什么能解决我的具体情况。
当使用验证闭包的三参数(值、对象、错误)版本时,底层代码假设所有错误都将添加到错误对象中。为了返回表示消息键的字符串或字符串列表。
如果同时使用命令对象,则行为是相同的。
以下是两个参数验证闭包的工作示例:
class ObjectA {
ObjectB fieldB
ObjectC fieldC
static constraints = {
fieldC(nullable: true, validator: { value, object->
if (object.fieldB != ObjectB.SOMETHING && !value) {
return "default.null.message"
// You can also use the list style return (especially if you need to pass additional parameters used by the message)
//return ["default.null.message"]
}
})
}
}
这里有一个三参数验证闭包的工作示例:
class ObjectA {
ObjectB fieldB
ObjectC fieldC
static constraints = {
fieldC(nullable: true, validator: { value, object, errors ->
if (object.fieldB != ObjectB.SOMETHING && !value) {
// When "errors" is passed into the closure, you must use it to signal error cases
errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field "{0}" cannot be null")
}
})
}
}