4

私は Weblogic 11g で JSF プロジェクトに取り組んでおり、最初の設計では JSF バッキング Bean を呼び出して EJB3.0 Bean を呼び出し、ビジネス ロジックとデータ アクセス呼び出しを実行します。EJB 参照をバッキング Bean に注入しようとすると、@EJB アノテーションがプロジェクトで機能しないようです。テストしているクラスにヒットするたびに、EJB のコンストラクターが呼び出されず、最終的に NPE が発生します。EJB3.0 Bean を JSF バッキング Bean に注入することは可能ですか? JSF バッキング Bean を介して EJB を呼び出す別の方法はありますか? ベストプラクティスは何ですか?

4

5 に答える 5

4

私はいくらかグーグルで検索しましたが、これはWeblogicの既知の問題のようです。多くの同様のトピックが未回答のままです。

私はこのブログ@EJBを見つけました.Weblogicweb.xmlでは、JSFではなく、によって定義されたリソースに対してのみ機能することを確認しています。このブログServletContextListenerでは、JNDI を使用するよりもはるかに優れた IMO を使用した回避策についても詳しく説明しています。

また、EJB モジュールがサブディレクトリに含まれていない場合に Weblogic が機能し始めたことを確認するこの OTN トピックも見つけました (2011 年 2 月 15 日午後 5 時 44 分に投稿された回答を参照してください)。@EJB

于 2011-06-08T16:33:17.950 に答える
3

JSF と EJB を使用して何かをデプロイする場合、これは Weblogic 固有の問題であることが判明しました。Weblogic 11g を使用して JSF マネージド Bean で @EJB インジェクションを機能させる方法を説明している Oracle フォーラムで、次の投稿を見つけました。

JSF マネージド Bean への EJB3.0 インジェクション

アップデート:

あまりにも長い間車輪を回転させた後、Weblogic 11g の JSF ManagedBean に EJB を注入することをあきらめなければなりません。Tomcat では問題なく動作するようです。たぶん、EJB3 と JSF の実装は 12G でより良くなるでしょう...

于 2011-06-13T15:47:00.273 に答える
2

機能させるには、次の 2 つの手順に従う必要があります。

  1. jsf-2.0.war を LIBRARY としてデプロイします。/ORACLE_HOME/wlserver_10.3/common/deployable-libraries にあります。

ここに画像の説明を入力

  1. Web プロジェクトで、WEB-INF/weblogic.xml に jsf-2.0.war ライブラリへの参照を追加します。

        <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
    
        <wls:weblogic-version>10.3.3</wls:weblogic-version>
        <wls:context-root>your_context_app</wls:context-root>
    
        <wls:library-ref>
          <wls:library-name>jsf</wls:library-name>
          <wls:specification-version>2.0</wls:specification-version>
          <wls:implementation-version>1.0.0.0_2-0-2</wls:implementation-version>
          <wls:exact-match>true</wls:exact-match>
        </wls:library-ref>                      
    
    </wls:weblogic-web-app>
    

weblogic 10.3.3 および 10.3.5 でこれを正常にテストしました。これがうまくいかない場合は、アプリケーションを EAR ファイルの一部としてデプロイしてみてください。

于 2014-10-16T12:18:50.113 に答える
1

これがビートです!これを修正する簡単な方法があります。

  1. ...wlserver_10.3\common\deployable-libraries の下にある jsf-2.0.war を開きます。

  2. WEB-INF/lib に移動し、wls.jsf.di.jar JAR をどこかに保存します。

  3. WLs.jsf.di.jar JAR を WAR アプリケーションの lib フォルダーの下に置きます。

  4. 配備

@ManagedBean のプロパティに @EJB を追加するだけで、すべてが機能するはずです。

于 2011-06-15T18:27:36.850 に答える
1

JSF ManagedBean Web アプリケーションでローカル EJB Bean にアクセスできるようにするための @EJB アノテーションの代替手段があります。EJB クラスと WAR が同じ EAR ファイルにパッケージ化されていることを考慮して、次の手順を実行します。

  1. ejb-jar.xmlを構成して、WebLogic が EJB Bean を外部コンポーネントに公開するように指示します。

    <enterprise-beans>
    <session>
        <ejb-name>MyEJBBean</ejb-name>
        <business-local>com.app.MyEJBBeanLocalInterface</business-local>
        <ejb-class>com.app.MyEJBBeanLocalImpl</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
        <ejb-local-ref>
            <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
            <local>com.app.MyEJBBeanLocalInterface</local>
        </ejb-local-ref>
    </session>
     <enterprise-beans>
    
  2. Web アプリケーションのweb.xmlに、ejb-link 名を介して EJB への参照を挿入します。ejb-ref-name は、JSF マネージド Bean に表示される名前です。

    <ejb-local-ref>
      <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <local>com.app.MyEJBBeanLocalInterface</local>
      <ejb-link>MyEJBBean</ejb-link>
    </ejb-local-ref>
    
  3. JSF マネージド Beanで、次のように JNDI ルックアップを介して EJB Bean を呼び出します 。

    try {
        Context context = new InitialContext();
        MyEJBBeanLocalInterface myEJBBean = 
        context.lookup("java:comp/env/ejb/MyEJBBeanLocal");
    } catch (NamingException e) {
        e.printStackTrace();
    }

私の場合、Weblogic 10.3.6 (11g)、JSF 2.0、および EJB 3.0 を JPA (Eclipselink) で使用していました。

于 2014-02-11T02:30:46.503 に答える