Grails控制器中动态混合的异常处理

Grails控制器中动态混合的异常处理,grails,mixins,Grails,Mixins,我在Grails 2.3.11控制器上使用动态混合,原因很简单: class SomeApiController { def SomeApiController() { SomeApiController.mixin MyControllerMixin } ... 不幸的是,它不适用于异常处理程序,例如: class MyControllerMixin { ... def businessException( BusinessExcept

我在Grails 2.3.11控制器上使用动态混合,原因很简单:

class SomeApiController {
    def SomeApiController() {
        SomeApiController.mixin MyControllerMixin
    }
    ...
不幸的是,它不适用于异常处理程序,例如:

class MyControllerMixin {
    ...
    def businessException( BusinessException e ) {
        log.error( "API exception: ${e.message} ${e.errorCode}", e )
        def result = [
            status: 'Failure',
            errorCode: e.errorCode.name()
        ]
        response.status = 400
        render result as JSON
    }
    ...
}
在这种情况下,当从某处抛出
BusinessException
时,将调用
SomeApiController
中的默认异常处理程序。不过,如果我将处理程序直接放在控制器中,效果会很好,但这显然是我想要避免的

是否有任何解决方法可以使该功能正常工作?

请参阅。这包括以下几点

异常处理程序方法必须在编译时出现。 具体来说,异常处理程序方法是运行时 不支持对控制器类进行元编程


可能是因为您的mixin更改是在运行时完成的,而异常处理是在编译时完成的。我知道您正在使用2.3.11,所以这对您现在没有帮助,但请注意,当/如果您移动到2.4时,您可以使用trait。看见我为2.4.1实现了这一点。2.3.11可能使用的一种方法是在控制器扩展的基类中定义异常处理程序方法。这并不像使用特质那么巧妙,但你不能在2.3.11中使用特质。谢谢杰夫,我错过了文档中的那部分!最终我会选择traits,但现在我只能选择2.3.x。