index.xhtml
次のように、注入された EJB を使用する JSF ページに関連付けられたマネージド Bean があります。
// Code inside managed bean
@EJB
QueryEndpointLocal queryEndpoint;
public void search() {
//...
SearchResult result = queryEndpoint.search(query, resultFormat);
//...
}
QueryEndpoint は、次の名前の別の EJB を利用しますQueryEngine
。
// Code inside QueryEndpoint
@EJB
QueryEngine queryEngine;
QueryEngine
現在、 namedによく似た別の EJB がありQueryEngineLite
ます。それらの違いは、HBASE データベースに接続する際にQueryEngineLite
、リソースとしてエンタープライズ アプリケーションにバンドルされているローカル ダンプ ファイルを使用することです。QueryEngine
どちらも起動時にロードされ@PostConstruct
、接続を初期化する -annotated メソッドがあります。QueryEndpoint
それらのうちの 1 つだけがデプロイされたアプリケーションで使用され、もう 1 つStartup
はそのままの状態で使用されます。PostConstruct
注釈はコメントアウトされています。これを処理するためのはるかに優れた方法があり、現在のソリューションは悪いものであることはわかっていますが、プロジェクトの将来のフェーズで変更される予定です。AppServer が管理する接続プールを利用して HBASE と通信する計画がありますが、現時点では、接続は HBASE の Java API を使用するライブラリによって処理されます。
これで、Lite EJB を使用しても何の問題もありません。インターフェイスは機能し、Web サービスも機能し、すべて問題ありません。HBASE に関連付けられた EJB ( QueryEngine
) を使用すると、Glassfish は index.xhtml の要求に対して HTTP 403 エラーで応答し、次の行が server.log に挿入されます。
INFO: JACC Policy Provider:Failed Permission Check: context (" App/App-war_war ") , permission (" ("javax.security.jacc.WebUserDataPermission" "" "GET") ")
INFO: JACC Policy Provider:Failed Permission Check: context (" App/App-war_war ") , permission (" ("javax.security.jacc.WebUserDataPermission" "" "GET:CONFIDENTIAL") ")
INFO: JACC Policy Provider:Failed Permission Check: context (" App/App-war_war ") , permission (" ("javax.security.jacc.WebUserDataPermission" "/favicon.ico" "GET") ")
INFO: JACC Policy Provider:Failed Permission Check: context (" App/App-war_war ") , permission (" ("javax.security.jacc.WebUserDataPermission" "/favicon.ico" "GET:CONFIDENTIAL") ")
なぜこれが起こるのか、どうすれば修正できるのかわかりません。最初のエンジン EJB が使用されたときに機能しないのは JSF ページだけであることに注意してください。Web サービスなどのアプリケーションの他の部分は、両方のエンジンで完全に機能します。よろしくお願いします。