1

在我的应用程序中,我有一个在创建时执行重载(解析不同文件)的服务。数据是元数据,因此在运行时不会更改(本地化字符串、键/值映射等)。因此我决定将此服务设为 SessionScoped,因此我不需要在每个请求中解析值。不是 ApplicationScoped 以确保在用户再次登录时刷新数据。

这很好用,但现在我需要在一个线程中访问该服务,该线程使用@Schedule注释运行。Weld 当然不喜欢这样,他说:org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped

@Singleton
public class DailyMails {

    @Inject
    MailService mailService; //just Named

    @Inject
    GroupDataService groupDataService; //Stateless

    @Inject
    LocalizationService localizationService; //SessionScoped

    @Schedule(hour = "2", minute = "0", second = "0", dayOfWeek="Mon,Tue,Wed,Thu,Fri", persistent = false)
    public void run() {
        //do work
    }
}

此时我可以手动创建一个 Session,以便我可以使用 SessionScoped 服务吗?

编辑:我知道,服务应该是 SessionScoped,也不应该包含任何数据(-Collections)。然而,在这种情况下,避免多次文件系统访问对我来说似乎是合法的。

我考虑过将服务设置为无作用域的服务,并将数据“缓存”在会话作用域的 bean 中。但是,我需要将会话 bean 注入该服务,这将再次使服务成为“会话范围”。

4

1 回答 1

0

这不应该工作:

@Inject @New
LocalizationService localizationService; 

至少,这就是我解释规范的方式。

于 2013-05-03T13:05:53.110 回答