GroovyCastException元类i18n

时间:2016-02-02 13:03:13

标签: grails groovy metaclass

此问题与another有关。 我想向构造函数添加属性并覆盖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中。不幸的是,控制台输出中没有printlns。

1 个答案:

答案 0 :(得分:2)

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

如果您只想在发生异常时在错误页面上显示本地化消息,最佳做法是使用&#34; 500&#34; URL映射,并在视图中使用<g:renderException>呈现异常。

如果要拦截异常,可以更改&#34; 500&#34; 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中进行本地化。