【问题标题】:How to lookup EJB using JMS and CDI 1.2如何使用 JMS 和 CDI 1.2 查找 EJB
【发布时间】:2018-02-21 12:37:55
【问题描述】:

我正在将我的项目迁移到 Wildfly10 并使用 cdi-api 1.2。

我一直在使用这种结构来获取 beanManager,然后查找一些资源(例如 EJB)。

import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;

public abstract class ServiceLocator {
    //....
    private BeanManager getBeanManager() throws NamingException {
        return CDI.current().getBeanManager();
    }
    public static <T> T lookup(Class<T> clazz) {
        BeanManager manager = this.getBeanManager(); 
    //...
}

这在 Servlet 或 Filter 中使用效果很好。

但是,当我在 MDB JMS 中使用相同的功能时,例如:

@MessageDriven(mappedName = MyQueueProcessor.QUEUE_NAME, 
//...
public class RecebimentoMensagemCAM0021MDB {
    @Override
    protected void process(Object obj) {
        MyServices service = ServiceLocator.lookup(MyServices.class);
   //...

发生此异常:

java.lang.IllegalStateException: WFLYWELD0039: Singleton not set for 
ModuleClassLoader for Module "org.apache.activemq.artemis.ra:main" 
from local module loader @629f0666 (finder: local module finder 
@1bc6a36e (roots: /home/confidence/wildfly-
10.1.0.Final/modules,/home/confidence/wildfly-
10.1.0.Final/modules/system/layers/base)). This means that you are 
trying to access a weld deployment with a Thread Context ClassLoader 
that is not associated with the deployment.
    at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:77)
    at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:134)
    at org.jboss.weld.Container.instance(Container.java:55)
    at org.jboss.as.weld.WeldProvider.getCDI(WeldProvider.java:61)
    at javax.enterprise.inject.spi.CDI.current(CDI.java:60)
    at br.com.project.ServiceLocator.getBeanManager(ServiceLocator.java:xx)
    at br.com.project.ServiceLocator.lookup(ServiceLocator.java:xx)

任何人都可以帮助如何在 JMS 中进行此查找。

提前致谢。

【问题讨论】:

  • 这只是一个盲目的尝试,但仍然 - 您可以尝试不使用来自 MDB 的CDI.current() 吗?相反,只需将@Inject BeanManager bm 直接尝试到MDB 中。 MDB 是(从 CDI 的角度来看)所谓的 InjectionTarget 因此仍然有资格被注入。
  • 我尝试使用@Inject,但它返回了一个空对象

标签: java queue jms cdi wildfly-10


【解决方案1】:

您可以仅使用 CDI 获取服务实例,而不需要您的定位器,例如:

MyServices myServices = CDI.select(MyServices.class).get()

http://docs.jboss.org/cdi/learn/userguide/CDI-user-guide.html#_obtaining_a_contextual_instance_by_programmatic_lookup

【讨论】:

  • 我遇到了同样的异常:原因:java.lang.IllegalStateException:WFLYWELD0039:本地模块加载器@的模块“org.apache.activemq.artemis.ra:main”的ModuleClassLoader没有设置单例133e16fd(查找器:在 org.jboss.as.weld.WeldProvider.getCDI(WeldProvider.java:61) 在 javax.enterprise.inject 的 org.jboss.weld.Container.instance(Container.java:55) 的本地模块查找器。 spi.CDI.current(CDI.java:60)
  • 请发布你的 pom.xml
  • 我有一个非常大的项目,里面有很多子模块。哪些信息会有所帮助?
  • 您是否声明了任何 CDI 1.2 库或某些实现,如焊接依赖项?
  • 是的,我的根项目有&lt;dependency&gt; &lt;groupId&gt;javax.enterprise&lt;/groupId&gt; &lt;artifactId&gt;cdi-api&lt;/artifactId&gt; &lt;version&gt;1.2&lt;/version&gt; &lt;/dependency&gt;
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2014-06-05
  • 1970-01-01
相关资源
最近更新 更多