Grails GroovyCastException元类i18n

Grails GroovyCastException元类i18n,grails,groovy,metaclass,Grails,Groovy,Metaclass,这个问题与我有关。 我想向构造函数添加属性并覆盖getLocalisedMessage()函数,以获得正确的带错误的翻译消息。首先,我想重载构造函数来设置属性,但当我添加: GroovyCastException.metaClass.constructor = { Object objectToCast, Class classToCastTo -> def constructor = GroovyCastException.class.getConstructor(Object,

这个问题与我有关。 我想向构造函数添加属性并覆盖getLocalisedMessage()函数,以获得正确的带错误的翻译消息。首先,我想重载构造函数来设置属性,但当我添加:

GroovyCastException.metaClass.constructor = { Object objectToCast, Class classToCastTo ->
    def constructor = GroovyCastException.class.getConstructor(Object, Class)
    def instance = constructor.newInstance(objectToCast, classToCastTo)
    // ... do some further stuff with the instance ...
    println "Created ${instance} and executed!"
    instance
}
然后抛出GroovyCastException,控制台中没有println

为什么?

如何重载构造函数、设置属性(objectToCast、classToCastTo),然后重载getLocalizedMessage


我也试过:

def originalMapConstructor = GroovyCastException.metaClass.retrieveConstructor(Map)

GroovyCastException.metaClass.constructor = { Map m ->
    // do work before creation
    print "boot do work before creation "
    m.each{
        print it
    }
    print "boot do work before creation 2"
    def instance = originalMapConstructor.newInstance(m)
    // do work after creation
    print "boot do work after creation"
    instance
}

我已经将它放在控制器(捕捉异常之前)和Bootstrap.groovy中。不幸的是,控制台输出中没有println。

您最好不要使用元编程进行国际化。在grails中,如果可能的话,您应该在视图层中使用
标记来执行此操作。如果不是,下一个最佳选择是控制器层

如果您只想在发生异常时在错误页面上显示本地化消息,最佳做法是使用“500”URL映射,并在视图中使用
呈现异常

如果要截获异常,可以将“500”URL映射更改为控制器,并在将其传递给视图之前将其包装到该控制器。例如:

// UrlMappings.groovy
class UrlMappings {
     static mappings = {
         ...
         "500"(controller:"error", method: "serverError")
     }
}

// ErrorController.groovy
class ErrorController {
    def serverError() {
        def exception = request.exception.cause
        if (exception instanceof GroovyCastException) {
            exception = new LocalizedGroovyCastException(exception)
        }
        [exception: exception]
    }
}

然后在一个新类中进行本地化
LocalizedGroovyCastException

为什么不使用委托?这并不是因为你可以在groovy中做这种事情,你应该这样做:你不应该覆盖异常的元类“仅仅”在ui层中添加翻译。你打开了一扇通向无数不可预测事物的大门bugs@injecteer是的,现在我正在检查ExpandoMetaClass和delegate。@JérémieB而不是“就是不”,请回答如果我的方式不好,您将如何翻译这样的异常。我想写得尽可能干净,但我现在没有看到任何其他解决方案。此应用程序没有任何视图。它只生成JSON API。这就是为什么我要翻译我的错误并以最人性化的形式发送回(当然扩展为JSON,而不仅仅是http状态)。在这种情况下,您可以使用ErrorController将服务器错误呈现为JSON。包装异常以提供i18n的策略仍然适用。因此,如果http状态为400并由服务引发GroovyCastException,我应该如何处理它?我不确定把try-catch块放在哪里,它应该是什么样子。通常,如果输入错误,您会希望发送400。我建议更仔细地验证输入,而不是依赖强制转换异常。特别是,您可以创建一个命令对象,以利用grails对数据绑定和验证的广泛支持:我听说过,但我总是想知道是否应该为每个域类创建命令对象,并在每次创建/更新操作之前尝试(通过这样的命令对象解析数据)?这是一种常见的做法吗?