複数のコントローラー クラスと DefaultAnnotationHandlerMapping を使用する場合、Spring Portlet MVC 3.1 を使用すると問題が発生します。
バックグラウンド
- Render & Action フェーズのアノテーションを備えた Spring Portlet MVC 3.1 を使用しています。
- JBoss EPP 5.1.1 を使用しています
問題
- パラメータを使用したポートレット レンダリング リクエストの場合、ポートレットで正しくないページがレンダリングされる
原因
- Spring ポートレット MVC は、正しいアノテーションを持つ予想されるメソッドとは異なる @RenderMapping のメソッドを使用しています
テクニカル分析
すべてのコントローラーには @RenderMapping および @ActionMapping アノテーションが含まれており、ポートレット URL で設定されたパラメーターに基づいて予期されるメソッドが確実に呼び出されるようにするための「params」引数があります。デフォルトのレンダリングには、「params」引数のない @RenderMapping アノテーションを持つメソッドがあり、リクエストにパラメーターが含まれていない場合に空の JSP をレンダリングするために使用します。
あなたの本の第 7 章と第 8 章を読んだことから、Dispatcher Portlet が着信要求の適切なハンドラー マッピングを取得し、それを構成済みのコントローラー Bean の適切なメソッドに送信しようとすることがわかりました。私たちの想定では、デフォルトの @RenderMapping アノテーション (パラメーターなし) は、特定のリクエストパラメーターに一致するアノテーションを持つコントローラーに他のメソッドがないことを確認した後にのみ呼び出されると想定していました。
ただし、この仮定が正しくないことを認識するためにデバッグを行いました。DefaultAnnotationHandlerMapping は、コントローラー Bean で使用可能なアノテーションのリストを事前定義された順序でトラバースするように見えます。これは、デフォルトの @RenderMapping アノテーション (パラメーターなし) を持つコントローラー Bean がリストの前に表示される場合、リストのさらに下にある正しいメソッドではなく、デフォルトの @RenderMapping アノテーション (パラメーターなし) を持つメソッドが呼び出されることを意味します。 .
明らかなエラー
Windows環境で開発し、Linux環境にデプロイしています。Windows では、ハンドラーがコントローラー Bean をアルファベット順に循環することがわかります。そのため、最初に、'Z' に最も近い Bean 名を持つパラメーターなしで @RenderMapping アノテーション付きメソッドをコントローラーに追加することで問題を解決しました。
ただし、Linux では、コントローラー Bean が別の順序で検出されるようです。問題を強調するために、以下に Spring ログを添付しました。no params @RenderMapping アノテーションは YourDetailsController にあり、Windows のログでわかるように、リストの最後に表示されますが、Linux では表示されません。つまり、リスト内の YourDetailsController の後に表示されるコントローラーの 1 つにアクセスしようとすると、代わりに YourDetailsController の no params アノテーションが常にヒットすることになります。
質問
- 私たちの仮定は間違っていますか?
- 私たちの診断は期待される行動を反映していますか? それとも、Spring Portlet MVC のバグですか?
- ハンドラーマッピング Bean リストを形成するためにスキャンされた注釈を取得する別の方法はありますか?
- (注釈の代わりに) xml 構成を使用すると、問題が解決しますか?
- 複数のハンドラー マッピングと順序を定義して、デフォルトのハンドラー マッピングがディスパッチャー ポートレットによって使用される最後のハンドラー マッピングになるようにすることはできますか?
この問題に関するご意見やアドバイスをいただければ幸いです。