从另一个控制器访问Groovy控制器闭包

sg24os4d  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(226)

在我们的代码库中,我们在控制器中有一个闭包,如下所示:

def doComputation = {
    def someObject = SomeObject.read(params.long("objectId"))

    //some irrelevant logic

    def response = [importantVariable : importantInteger, someOtherVariable : someOtherInteger]
    render response as JSON
}

当然,这通常是从.gsp页面调用的,但是有没有办法从不同控制器中的闭包调用它呢?

def someOtherClosure = {
    //some more irrelevant logic

    def responseFromOtherClosure = doComputation(objectId : someLong)
    theValueIWant = responseFromOtherClosure.importantVariable

    //more logic
}
z4bn682m

z4bn682m1#

但是有没有办法从不同控制器中的闭包调用它呢?
是有的。
闭包只是控制器类中的属性,它们是public。控制器被配置为Spring bean,因此您可以(不应该)将一个控制器注入到另一个控制器中,然后从那里引用闭包属性。
我认为这回答了您的问题,但没有很好的理由这样做。正确的解决方案将取决于一些细节,但如果您有2个控制器操作需要共享一些逻辑,最佳实践是将该逻辑移动到一个服务中,并将该服务注入到所有需要它的控制器中。
根据您尝试完成的任务,您可能希望第一个控制器发出redirectforward,这将导致第二个控制器,而不是直接从另一个控制器调用控制器的代码(同样,这样做也没有什么好的理由)。

相关问题