私は Weblogic 11g で JSF プロジェクトに取り組んでおり、最初の設計では JSF バッキング Bean を呼び出して EJB3.0 Bean を呼び出し、ビジネス ロジックとデータ アクセス呼び出しを実行します。EJB 参照をバッキング Bean に注入しようとすると、@EJB アノテーションがプロジェクトで機能しないようです。テストしているクラスにヒットするたびに、EJB のコンストラクターが呼び出されず、最終的に NPE が発生します。EJB3.0 Bean を JSF バッキング Bean に注入することは可能ですか? JSF バッキング Bean を介して EJB を呼び出す別の方法はありますか? ベストプラクティスは何ですか?
5 に答える
私はいくらかグーグルで検索しましたが、これはWeblogicの既知の問題のようです。多くの同様のトピックが未回答のままです。
私はこのブログ@EJB
を見つけました.Weblogicweb.xml
では、JSFではなく、によって定義されたリソースに対してのみ機能することを確認しています。このブログServletContextListener
では、JNDI を使用するよりもはるかに優れた IMO を使用した回避策についても詳しく説明しています。
また、EJB モジュールがサブディレクトリに含まれていない場合に Weblogic が機能し始めたことを確認するこの OTN トピックも見つけました (2011 年 2 月 15 日午後 5 時 44 分に投稿された回答を参照してください)。@EJB
JSF と EJB を使用して何かをデプロイする場合、これは Weblogic 固有の問題であることが判明しました。Weblogic 11g を使用して JSF マネージド Bean で @EJB インジェクションを機能させる方法を説明している Oracle フォーラムで、次の投稿を見つけました。
JSF マネージド Bean への EJB3.0 インジェクション
アップデート:
あまりにも長い間車輪を回転させた後、Weblogic 11g の JSF ManagedBean に EJB を注入することをあきらめなければなりません。Tomcat では問題なく動作するようです。たぶん、EJB3 と JSF の実装は 12G でより良くなるでしょう...
機能させるには、次の 2 つの手順に従う必要があります。
- jsf-2.0.war を LIBRARY としてデプロイします。/ORACLE_HOME/wlserver_10.3/common/deployable-libraries にあります。
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 ファイルの一部としてデプロイしてみてください。
これがビートです!これを修正する簡単な方法があります。
...wlserver_10.3\common\deployable-libraries の下にある jsf-2.0.war を開きます。
WEB-INF/lib に移動し、wls.jsf.di.jar JAR をどこかに保存します。
WLs.jsf.di.jar JAR を WAR アプリケーションの lib フォルダーの下に置きます。
配備
@ManagedBean のプロパティに @EJB を追加するだけで、すべてが機能するはずです。
JSF ManagedBean Web アプリケーションでローカル EJB Bean にアクセスできるようにするための @EJB アノテーションの代替手段があります。EJB クラスと WAR が同じ EAR ファイルにパッケージ化されていることを考慮して、次の手順を実行します。
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>
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>
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) で使用していました。