2014-11-03 58 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>()方式太冗长;只需使用[]。您仍然会在左侧拥有自我记录集合和泛型类型,并且其功能完全相同。