我正在创建一个可供WEB或桌面应用程序使用的JAR。这个JAR应该有一些带有@RequestScoped类和其他CDI注释的类,所以我对它有一些疑问:
1)我知道@RequestScoped只是用于HTTP请求,但是我如何在桌面应用程序中使用它呢?有可能吗? 2)我正在使用这种依赖:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.4.1.Final</version>
</dependency>但这种依赖只是为了焊接WEB,我需要一些更通用的,应该在WEB或桌面工作。
如果我使用“焊缝-se”作为依赖,我的JAR将只在桌面上工作,我不想这样做。
发布于 2017-01-18 08:42:46
正如用户MouseEvent在评论中所说的那样,通常最好有两个单独的罐子。
但是,我想回答的是关于非web环境中的@RequestScoped bean的问题(还有@Session和@Application)。那么,假设我们正在SE环境中使用焊接--那么,什么是有效的,哪些是无效的呢?
@ApplicationScoped 可以很好地工作,就像您预期的那样。每个应用程序一个bean。它的生命周期从启动容器开始,在关闭容器时停止。另一种替代方法是使用@javax.inject.Singleton (注意,这是CDI单例,而不是CDI单例) bean,但应该仅限于SE --这同样适用于应用程序作用域bean,但没有创建代理。在某些情况下,这可能会使您占上风,但也会防止序列化之类的事情。@SessionScoped目前不能在SE环境中工作,因为它在那里没有任何意义。就像你自己说的,你在那里没有时间。@RequestScoped 确实在SE中工作。这是有意义的,因为“请求”不仅仅意味着普通的旧HTTP请求。但是,您需要处理这个范围的激活。虽然有几种方法(例如扩展上下文和自己处理激活),但我建议使用Weld API-@ActivateRequestContext中提供的注释(实际上是拦截器绑定)。您只需将注释放在方法的顶部,Weld将在方法启动之前激活请求上下文,然后关闭它。您也可以将它放在整个类中,这意味着它将适用于每个方法。请注意,您需要依赖于Weld API才能访问该注释(或者您需要使用CDI2.0(在此也增加了中)。至于您的依赖关系,在SE环境中,您需要这样的环境:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>2.4.1.Final</version>
</dependency>https://stackoverflow.com/questions/41709859
复制相似问题