Struts2のConventionプラグインの恩恵
Conventionプラグインは、設定ファイルに記載することをアノテーションで代替できます。
特にActionクラスの設定に関してはActionクラスへ直接記載できるため設定ファイルが肥大化せず、 アプリケーション全体の設定とActionクラス独自の設定を分離 できます。
他にも、HTMLやJSPそれ以外の画面出力ファイルの配置場所をルール化、Actionクラス実行時に拡張子 .action が不要になる、他にもコーディングや設定をきれいにできる仕組みを提供します。
しかしそんな中でもいくつか標準の規約だけでは守りきれない部分もあります。そんなアンチパターンを紹介します。
絶対にやめましょう一覧
次の内容は、1つのアプリケーション内でやってはいけません。実行時エラーも出ないケースです。
- 複数のActionクラスやActionメソッドで、@Namespace と @Action の組み合わせが完全に重複する
- 実行時エラーにならず、どちらか一方のみ有効になります。
- @Namespaceと@Actionの組み合わせでURLが決定しますので、マッピングは正しく設計しましょう
- Actionクラスのexecute()メソッドに実装した上で、他にもActionメソッドを用意してしまう
- execute()メソッドは、同じActionクラスに属する@Actionがついたメソッドを実行するときには、必ず実行されます。
- execute()メソッドを実装しないか、またはexecute()を必ず使うようにするか、を決めましょう。
- prepare() と execute() メソッドの実装方針を決めないまま実装してしまう。
- execute()メソッドの利用と同様、設計/実装ポリシーを定めておきましょう。prepareはPreparableインタフェースを実装すると利用できます。
- prepare()はexecute()の前に実行されます。
- prepareXyzabc()はxyzabc()の前に実行されます。
できたらやめましょう一覧
以下の内容は、実際に可能ですが複雑になるので避けた方がよい方法です。
- Namespacesを使って1つのActionに複数のNamespaceを定義する
- InterceptorRefsを定義するだけの空Actionクラスをつくる
- ExceptionMappingsを定義するたけの空Actionクラスをつくる
- ActionSupportの定義済みResult以外をreturnする
- 正常系のResultで、複数種類のresultTypeを用意する
悩ましいところ
- Actionクラス1つに対し、複数の@Actionアノテーションを用意する
これは製造/設計ポリシー次第です。
Actionクラスが増えてしまうのが嫌な場合は、1つのActionクラスに複数用意します。
このとき以下の制約が当然つきます。
- Actionクラスが受け取るリクエストパラメータのフィールドが同じになる
- Validation定義が共有化されるので、個別設定が必要な場合はかなり複雑になる場合がある