【问题标题】:JavaEE and OSGI:How to get BeanManager for certain osgi bundleJavaEE and OSGI:How to get BeanManager for certain osgi bundle
【发布时间】:2016-10-20 03:39:58
【问题描述】:

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

在捆绑包 B 中,我引用了捆绑包 A(捆绑包 A)。我如何获得对 bundle A cdi 容器的 bundle B 引用。我当前的解决方案(在 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)

【问题讨论】:

  • 第一句话令人困惑:“据我所知,每个 osgi 包都有自己的 cdi 容器”。我写过的包都没有自己的 CDI 容器(我写了很多......)。
  • 对于它的价值——我对 CDI 一无所知,也不想这样做——听起来你想做的事情应该用 OSGi 服务来解决。
  • @Neil Bartlett 请仔细阅读。问题是关于 javaee 和 glassfish。
  • 是什么让你认为我没有仔细阅读?这句话仍然是绝对错误的。也许您的意思是“每个 OSGi 部署到 Glassfish 都有自己的 CDI 容器”。我仍然不知道这是否属实,但它可能更接近真相。

标签: java jakarta-ee glassfish osgi cdi


【解决方案1】:

调用BeanManager bm = CDI.current().getBeanManager(); 是为当前bean 归档获取BeanManager 的正确方法。例如。调用 this 的类所属的 bean 归档。在您的情况下,那将是bundle B。而且你没有beans.xml,因此例外。

据我了解,每个 osgi 包都有自己的 cdi 容器。

我对 OSGI 不太熟悉,但从 Weld 的角度来看,它会起作用。 Weld 将任何形式的存档(jar、war、...)视为 bean 存档,并且对于一个 bean 存档,您有一个经理。

如果您想从bundle A 获得对 BM 的引用,请在此处获取并公开我想的 getter。关键是您需要从它所属的实际存档中调用getBeanManager()

也许如果您详细说明您打算通过该 BM 实现什么目标,我可能会进一步帮助您。一般来说,我会避免从其他档案中获取对 BM 的引用。您始终可以拥有一个公开的 API,并让原始存档为您提供服务。

【讨论】:

  • 也许你知道 - 有没有办法按属于某个档案的类来获取 BeanManager?
  • 我不这么认为。一般来说,您不应该获得其他档案的经理。想象一下,您正在使用 3rd 方库,即使它甚至不是您的代码,这也会让您搞砸它。
  • 对于对象的跨包共享,您应该使用 OSGi 服务。
猜你喜欢
  • 2022-12-01
  • 2021-09-28
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2022-12-02
  • 2022-12-02
  • 2022-12-27
相关资源
最近更新 更多