SAStrutsの落とし穴

たまには実践的(笑)なエントリを。

SAStrutsは業務でかなり扱ってるのですが、Actionにははまりどころがあります。それを紹介。

getで始まるメソッドを作らない

これ超大事です。

SAStrutsJSPレンダリングするとき、ActionFormとActionのプロパティとpublicフィールドの値をMapに詰め込みます。こうすることでpublicフィールドをJavaBeansのプロパティのような感覚で扱うことが出来るわけです。

でもこの挙動は「意図せずActionのメソッドが呼び出されてしまう」という事態につながります。

特にActionに対応するActionFormを作って@ActionFormでインジェクトしている場合が要注意です。
開発者がわざわざActionForm作るってことは、「JSPレンダリングする情報はActionではなくてActionFormに全部持たせよう!」と思ってるはずで、まさかActionがJSPでのレンダリング対象になっているとは思わないです。

なのでうっかりActionに「getXxx」なんてメソッドを作ってしまうとはまってしまいます。

この挙動ははっきり言っていやです。
「URLは名詞であるべき」というREST風な考え方からするとgetで始まる名前がそもそもおかしいと言えないこともないですが、SAStrutsの「Actionのメソッドの名前がそのままURLになる」という性質上、Javaの常識に照らせばメソッド名が動詞始まりになるのは自然なことです。なので「get」という動詞が使われるのも、ごく自然。
なのにこのようなメソッドを作ってしまうと意図しない動作を引き起こしてしまいます。

ActionFormがあるときはActionからはプロパティ集めないとか、@Executeが付いたgetterは対象外にするとか、何らかの措置をしてほしかったなぁ、と思います。