7

現在、ステートレス EJB を Jboss 6 AS Final の CDI マネージド コントローラーに挿入しようとしています。コントローラは、JSF ページからアクセスできるコンテキストで管理されます。ステートレス Bean を注入すると、@EJB動作します。ステートレス EJB を注入すると@Inject、次の例外が発生します。

私のコントローラー:

@Named("TestController")
public class TestController {   
    @Inject
    private TestManagerLocal myTestManager;
        ...
    }
}

私のステートレス Bean:

@SuppressWarnings("unchecked")
@Stateless
public class TestManagerBean implements TestManagerLocal {

    @PersistenceContext
    private EntityManager em;
        ...
}

Bean のインターフェースには @Local アノテーションが付けられます。

myTestManager を呼び出そうとすると、次の例外が発生します。

WELD-000079 JNDI で EJB が見つかりませんでした: class de.crud.org$jboss$weld$bean-jboss$classloader:id="vfs:$$$usr$local$jboss$server$default$deploy$test$ ear"-SessionBean-TestManagerBean_$$_WeldProxy

ありがとう。

4

3 に答える 3

9

戦争に耳を傾ける余裕がない人のために、次の回避策を見つけました。

  • 戦争でEJBを作成する
  • その EJB に EJB モジュールから EJB を注入します。
  • CDI プロデューサー メソッドを追加する
  • @Injectこれらのプロデューサー メソッドの修飾子で修飾します。

コード:

// This bean is defined in the WEB module
@Stateless
public class EJBFactory {

    @EJB
    protected UserDAO userDAO;

    // ~X other EJBs injected here


    @Produces @EJBBean
    public UserDAO getUserDAO() {
        return userDAO;
    }

    // ~X other producer methods here
}

EAR 内のどこからでも EJB を注入できるようになりました。

// This bean is also defined in the web module
@RequestScoped
public class MyBean {

    @Inject @EJBBean
    private UserDAO userDAO; // injection works

    public void test() {
        userDao.getByID(...); // works
    }

}

EJBBean は単純な標準修飾子アノテーションです。完全を期すために、次のとおりです。

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface EJBBean {

}
于 2011-04-18T20:02:51.053 に答える
2

現在、EAR-Deployments の WAR が同じクラスローダーを共有していないという事実から、さまざまな問題が発生しています。JBoss-AS JIRA で進行中の議論については、https://issues.jboss.org/browse/JBAS-8683を参照してください (投票してください :-) )

UPDATE個別のクラスローダーを無効にする方法に関するこの情報を見つけました。オプション1はうまくいきましたが、これには細心の注意を払ってください。クラスローダの分離は理由もなく導入されていないため、今後、新たな問題が発生するようです...

于 2011-04-19T05:26:30.597 に答える
2

問題は、アプリケーションを ear としてビルドしてデプロイしたことです。すべての EJB を含む war としてアプリケーションをデプロイすると、Weld が機能します。

于 2011-02-22T23:09:29.160 に答える