0

JBoss 7.02 と LifeRay Portal 6.1.0 GA1 を使用して、Java ポートレット (GenericPortlet を拡張) に取り組んでいます。これは、LifeRay のリリース アーカイブからダウンロードできるバンドルの 1 つです。

デプロイ中に init() メソッドが呼び出されると、getRequestDispatcher() は null を返します。以下は、正確なエラー メッセージです。

09:22:15,972 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/my-portlet-name]] (MSC サービス スレッド 1-15) マッピング中のエラー: java.lang.NullPointerException

以下は、私の init() メソッドのスニペットです。

PortletConfig config = getPortletConfig();
PortletContext context = getPortletContext();
PortletRequestDispatcher normalView = context.getRequestDispatcher("/portlet.jsp");

一時的な回避策として、すべてのgetRequestDispatcher()呼び出しをdoView()問題なく実行できる場所に移動しました。getRequestDispatcher()doView 中に呼び出されたときに portlet.jsp を見つけることができる理由がわかりませんが、その間に呼び出されたときは見つかりませんinit()

これを解決する他のメソッドの先行呼び出しがありませんか? これは既知の問題ですか?

助けてくれてありがとう。

4

2 に答える 2

0

リクエストディスパッチャーを取得することdoViewは、私が見た唯一の場所です。initディスパッチする実際のリクエストがないため、その間に null が返されると思います。

通常、このinitメソッドは、リクエストごとに発生させたくない時間のかかる操作に使用されます。これは、ファイルからデータを読み取ったり、再利用可能な SQL 接続を作成したりするようなものです。

また、ポートレットの状態をスレッド セーフに保つ必要があることにも注意してください。一度に 1 つの要求にしか使用できないクラスまたはオブジェクト変数を作成しないでください。ポートレット メソッドは本質的にスレッド セーフではないため、要求が対話している変数が、同時に実行されている別の要求によって操作されないようにする必要があります。

于 2013-07-10T18:06:37.373 に答える
0

私はポートレットに詳しくありませんが、答えはサーブレットと同じはずです。

このinit()メソッドは、アプリケーションが最初にデプロイされるときに 1 回だけ呼び出されます。アクティブなリクエスト (誰も何も求めていない) もレスポンス (誰も出力を読み取ろうとしない) もありません。getRequestDispatcher(したがって、 ) が null を返すことは非常に合理的です。ではdoView()、リクエストとレスポンスを処理するときに、レスポンスの一部 (またはすべて) を生成するように別のリソースに依頼するのが理にかなっています。

あなたの質問に直接答えるには、 )からの場所をgetRequestDispatcher(問題なく見つけることができます。不足しているのはリクエストです。(とにかく、の結果はどこに表示されると思いますか?)portlet.jspinit()portlet.jsp

初期化中に何らかの出力を印刷したい場合は、アプリケーションがそのように設定されていれば、ログをファイルに記録してみてください。または、System.outコンテナーのコンソールの場所がわかっている場合は、 にデータを表示できます。(私はこの 2 番目のオプションをサーブレットで頻繁に使用します。)

于 2013-08-08T16:46:49.507 に答える