gpt4 book ai didi

JavaEE和OSGI :How to get BeanManager for certain osgi bundle

转载 作者:行者123 更新时间:2023-12-01 09:47:09 29 4
gpt4 key购买 nike

据我所知,每个 osgi 包都有自己的 cdi 容器。所以我有以下情况 - 我有两个 bundle :A 和 B。 bundle 部署在 glassfish4 中。在 bundle A 中,我有 cdi beans。在 bundle B 中,我没有 beans.xml -> 没有创建 bundle B 的 cdi 容器。

在 bundle B 中,我引用了 bundle A( bundle 捆绑 A)。如何在 bundle B 中获取对 bundle A cdi 容器的引用。我当前的解决方案(在 bundle 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的正确方法。例如。您调用它的类所属的 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,并让原始存档为您提供服务。

关于JavaEE和OSGI :How to get BeanManager for certain osgi bundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896155/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com