プロジェクトを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で、このルックアップ作品を作るためにどのように助けることができます。
ありがとうございます。
これはちょうど盲目的ですが、MDBから 'CDI.current()'を使うことはできませんか?代わりに、単純に '@Inject BeanManager bm'をMDBに直接入れてみてください。 MDBは(CDIの観点から)いわゆる「注入ターゲット」と呼ばれ、依然として注入可能である。 – Siliarus
@Injectを使用しようとしましたが、nullオブジェクトを返しました –