为什么我无法在自定义字段验证程序中返回全局消息密钥?



我想在字段中添加一个自定义验证器,以便强制执行条件非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")
            }
        })
    }
}

相关内容

  • 没有找到相关文章

最新更新