此问题与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。
答案 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
中进行本地化。