JavaEE和OSGI:如何获取某些osgi包的BeanManager

时间:2016-06-18 10:54:26

标签: java java-ee glassfish osgi cdi

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

在bundle B中,我引用了bundle A(Bundle bundleA)。如何将bundle B引用捆绑到一个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)

1 个答案:

答案 0 :(得分:1)

调用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,并让原始存档为您提供服务。