2014-11-03 48 views
0

據我所知,Grails的努力很努力地是無狀態的,但是我有一個需要我的控制器,以保持特定fizz值的一個應該每個HTTP請求中找到:緩存狀態Grails的控制器

class MyController { 
    List<Fizz> cachedFizzes = new ArrayList<Fizz>() 

    def index() { 
     Fizz fizz = extractFizz(params) 
     cachedFizzes << fizz 

     ... 
    } 

    ... 
} 

但是,當在本地測試這種方法時,似乎cachedFizzes已被每個HTTP請求重新實例化,因此無論我調用此控制器的其中一個操作多少次,列表Fizz es都不會增長。

那麼請問:我怎麼能(專門)與List<Fizz>將存在和整個應用(不控制器/ HTTP請求)的壽命增長注入MyController

+0

「我需要一個控制器來保留應該在每個HTTP請求中找到的特定fizz值」 - 這聽起來像是一個破碎的要求。我希望,如果你深入研究並確定實際需求是什麼,你將會得到更好的解決方案。我無法準確猜測實際需求是什麼,但我敢打賭,它可能更像是您需要訪問每個請求中的特定值,而不是該值需要在控制器實例中維護特別是,這幾乎肯定是錯誤的事情。 – 2014-11-03 14:07:42

+0

更常見,也更少問題的事情經常涉及維護控制器外的某個地方的狀態,比如單身bean可能是但不一定是服務。你可能仍然希望你的控制器是單身人士,但不是因爲這可以幫助你做你想在這裏做的事情。 – 2014-11-03 14:11:43

回答

0

有很少需要爲每個請求創建一個新的控制器實例,因此最好將其配置爲獨身Config.groovy

grails.controllers.defaultScope = 'singleton' 

但我認爲這是Grails的版本中的默認設置,其中這是可配置 - 你使用的是什麼版本的Grails?

另一種與singleton或每個請求實例一起工作的選項是使cachedFizzes靜態。

無關 - new ArrayList<Fizz>()方式太冗長;只需使用[]。您仍然會在左側擁有自我記錄集合和泛型類型,並且其功能完全相同。