我有一个@SessionScoped? DAO被注入到Stripes框架Interceptor构造函数中,似乎是从拦截器(在后续调用中)找到的,但是没有被注入到同一请求(和会话)中的服务中。为什么不在服务中重用相同的实例(在拦截器中初始化)(在同一个项目中的不同包中)?
使DAO成为@Singleton可以解决问题,但是这是不可接受的,因为DAO存储的信息必须在具有多个用户共享同一DAO实例的应用程序的整个用户会话中保持一致。
答案 0 :(得分:0)
如果Interceptor
不是会话范围的对象,那么您需要将Provider<YourDaoType>
注入Interceptor
。这是生命周期较长的物体依赖于寿命较短的另一物体时常用的模式。
答案 1 :(得分:0)
@SessionScoped
更改为注释有效的bind(DAO.class).in(ServletScopes.SESSION)
语句。据我所知,这些应该是等价的,但就我而言,它们会产生不同的结果。
令我困扰的一个方面是Stripes构建了在启动时注入DAO的拦截器导致错误,因为这发生在会话范围之外(DAO为@SessionScoped
。ActionBeanContext上下文信息是需要初始化我在构造动作bean期间调用的AbstractActionBean setContext方法中设置的DAO会话上下文。
感谢您的关注和帮助。