[英]JavaEE and OSGI:How to get BeanManager for certain osgi bundle
据我了解,每个osgi捆绑包都有自己的cdi容器。 因此,我遇到以下情况-我有两个捆绑包:A和B。捆绑包部署在glassfish4中。 AI捆绑包中有cdi bean。 在捆绑软件BI中没有bean.xml->没有为捆绑软件B创建cdi容器。
捆绑软件BI中有对捆绑软件A(捆绑软件bundleA)的引用。 我如何获得捆绑B中对捆绑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
的正确方法。 例如,调用它的类所属的bean档案。 在您的情况下,这就是bundle B
而且那里没有beans.xml
,因此是例外。
据我了解,每个osgi捆绑包都有自己的cdi容器。
我对OSGI不太熟悉,但是从Weld的角度来看是可行的。 Weld将任何形式的存档(jar,war,...)视为Bean存档,对于一个Bean存档,您只有一个管理员。
如果要从bundle A
引用BM,请在那里获取它,并公开我认为的吸气剂。 关键是您需要从它所属的实际存档中调用getBeanManager()
。
也许,如果您详细说明了该BM的目标,我可能会进一步帮助您。 一般来说,我将避免从其他档案中获取有关BM的参考。 您始终可以使用公开的API,并让原始存档向您提供服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.