2017-09-12 12 views
1

プロジェクトをWildfly10に、をcdi-api 1.2にマイグレーションしています。JMSとCDIを使用してEJBを検索する方法

私はこの構造を使用して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(); 
    //... 
} 

これはサーブレットまたはフィルターに使用して正常に動作します。しかし

、私は次のように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で、このルックアップ作品を作るためにどのように助けることができます。

ありがとうございます。

+0

これはちょうど盲目的ですが、MDBから 'CDI.current()'を使うことはできませんか?代わりに、単純に '@Inject BeanManager bm'をMDBに直接入れてみてください。 MDBは(CDIの観点から)いわゆる「注入ターゲット」と呼ばれ、依然として注入可能である。 – Siliarus

+0

@Injectを使用しようとしましたが、nullオブジェクトを返しました –

答えて

0

あなたは、単に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

+0

同じ例外がありました:原因:java.lang.IllegalStateException:WFLYWELD0039:モジュール "org.apache.activemq.artemis.raのModuleClassLoaderにSingletonが設定されていません: org.jboss.as.weld.WeldProvider.getCDI(WeldProviderでローカルモジュールファインダー \t org.jboss.weld.Container.instanceで(Container.java:55) \t:133e16fd(ファインダー@ローカルモジュールローダから「メイン。\tで、CDI.current(CDI.java:60) –

+0

、あなたのpom.xmlを投稿してください。 –

+0

私は多くのサブモジュールを持つ非常に大きなプロジェクトを持っています。お役に立ちましたか? –

関連する問題