JavaEE 和 OSGI:How 获取特定 osgi 包的 BeanManager
JavaEE and OSGI:How to get BeanManager for certain osgi bundle
据我所知,每个 osgi 包都有自己的 cdi 容器。所以我有以下情况 - 我有两个包:A 和 B。包部署在 glassfish4 中。在 bundle A 中,我有 cdi bean。在 bundle B 中,我没有 beans.xml -> 没有为 bundle B 创建 cdi 容器。
在 bundle B 中,我引用了 bundle A (Bundle bundleA)。我怎样才能在 bundle B 中获取对 bundle A cdi 容器的引用。我当前的解决方案(在捆绑包 B 中):
BeanManager bm = CDI.current().getBeanManager();
抛出异常:
StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
org.jboss.weld.exceptions.IllegalStateException: WELD-001328: Unable to identify the correct BeanManager. The calling class com.temp.MyClass is not placed in bean archive
at org.jboss.weld.SimpleCDI.unsatisfiedBeanManager(SimpleCDI.java:89)
at org.glassfish.weld.GlassFishWeldProvider$GlassFishEnhancedWeld.unsatisfiedBeanManager(GlassFishWeldProvider.java:89)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.findBeanManager(SimpleCDI.java:67)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.load(SimpleCDI.java:47)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.load(SimpleCDI.java:40)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3589)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2374)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2337)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2252)
at com.google.common.cache.LocalCache.get(LocalCache.java:3990)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3994)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4878)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4884)
at org.jboss.weld.SimpleCDI.getBeanManager(SimpleCDI.java:105)
at org.jboss.weld.SimpleCDI.getBeanManager(SimpleCDI.java:38)
调用 BeanManager bm = CDI.current().getBeanManager();
是为当前 bean 存档获取 BeanManager
的正确方法。例如。您调用它的 class 所属的 bean 存档。那将是 bundle B
在你的情况下。而且你没有 beans.xml
因此例外。
As I understand right every osgi bundle has its own cdi container.
我对 OSGI 不是很熟悉,但从 Weld 的角度来看,这是可行的。 Weld 将任何形式的存档(jar、war、...)视为 bean 存档,对于一个 bean 存档,您有一个管理器。
如果你想从 bundle A
获得对 BM 的引用,在那里获取它并暴露一个 getter 我想。关键是您需要从它所属的实际存档中调用 getBeanManager()
。
也许如果你详细说明你打算用那个 BM 实现什么,我可能会进一步帮助你。一般来说,我会避免从其他档案中获取对 BM 的引用。您始终可以公开 API 并让原始存档为您提供服务。
据我所知,每个 osgi 包都有自己的 cdi 容器。所以我有以下情况 - 我有两个包:A 和 B。包部署在 glassfish4 中。在 bundle A 中,我有 cdi bean。在 bundle B 中,我没有 beans.xml -> 没有为 bundle B 创建 cdi 容器。
在 bundle B 中,我引用了 bundle A (Bundle bundleA)。我怎样才能在 bundle B 中获取对 bundle A cdi 容器的引用。我当前的解决方案(在捆绑包 B 中):
BeanManager bm = CDI.current().getBeanManager();
抛出异常:
StandardWrapperValve[default]: Servlet.service() for servlet default threw exception
org.jboss.weld.exceptions.IllegalStateException: WELD-001328: Unable to identify the correct BeanManager. The calling class com.temp.MyClass is not placed in bean archive
at org.jboss.weld.SimpleCDI.unsatisfiedBeanManager(SimpleCDI.java:89)
at org.glassfish.weld.GlassFishWeldProvider$GlassFishEnhancedWeld.unsatisfiedBeanManager(GlassFishWeldProvider.java:89)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.findBeanManager(SimpleCDI.java:67)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.load(SimpleCDI.java:47)
at org.jboss.weld.SimpleCDI$ClassNameToBeanManager.load(SimpleCDI.java:40)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3589)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2374)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2337)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2252)
at com.google.common.cache.LocalCache.get(LocalCache.java:3990)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3994)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4878)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4884)
at org.jboss.weld.SimpleCDI.getBeanManager(SimpleCDI.java:105)
at org.jboss.weld.SimpleCDI.getBeanManager(SimpleCDI.java:38)
调用 BeanManager bm = CDI.current().getBeanManager();
是为当前 bean 存档获取 BeanManager
的正确方法。例如。您调用它的 class 所属的 bean 存档。那将是 bundle B
在你的情况下。而且你没有 beans.xml
因此例外。
As I understand right every osgi bundle has its own cdi container.
我对 OSGI 不是很熟悉,但从 Weld 的角度来看,这是可行的。 Weld 将任何形式的存档(jar、war、...)视为 bean 存档,对于一个 bean 存档,您有一个管理器。
如果你想从 bundle A
获得对 BM 的引用,在那里获取它并暴露一个 getter 我想。关键是您需要从它所属的实际存档中调用 getBeanManager()
。
也许如果你详细说明你打算用那个 BM 实现什么,我可能会进一步帮助你。一般来说,我会避免从其他档案中获取对 BM 的引用。您始终可以公开 API 并让原始存档为您提供服务。