1

我有一个@SessionScoped?被注入到 Stripes 框架拦截器构造函数中的 DAO,似乎是从拦截器中找到的(在后续调用中),但没有被注入到同一请求(和会话)中的服务中。为什么不在服务中重用相同的实例(在拦截器中初始化)(在同一项目的不同包中)?

使 DAO 成为 @Singleton 可以解决问题,但这是不可接受的,因为 DAO 存储的信息必须在具有多个用户共享同一个 DAO 实例的应用程序上的整个用户会话期间保持一致。

4

2 回答 2

0

如果Interceptor不是会话范围的对象,那么您需要Provider<YourDaoType>注入Interceptor. 当一个生命周期长的对象依赖于另一个生命周期较短的对象时,这是常用的模式。

于 2011-02-05T18:06:58.657 回答
0

好的,我想通了。我将其更改为注入工作@SessionScoped的语句。bind(DAO.class).in(ServletScopes.SESSION)据我了解,这些应该是等效的,但在我的情况下,它们会产生不同的结果。

在此过程中困扰我的一个方面是,Stripes 构建了在启动时注入 DAO 的拦截器,导致错误发生在会话范围之外(DAO 是@SessionScoped。ActionBeanContext 上下文信息需要初始化 DAO 会话上下文我设置了一个 AbstractActionBean setContext 方法,该方法在构建操作 bean 期间调用。

感谢您的关注和帮助。

于 2011-02-08T14:09:36.350 回答