ActionWrapper

null戻り値でエラーの件

SAStruts 1.0.2-rc4 を試していますが、
SASTRUTS-4 (ダウンロードで実行メソッドの戻り値をnullにするとぬるぽになる)
のバグが再発しているようです。
[Seasar-user:14521]

この件を、なんとなく調査しました。確かにチュートリアルのダウンロードのサンプルで再現します。
見ると、ActionWrapper.java:132で取得したforwardの値がnullのときは、return null;とすればよさそう、ただし例によって自信なしです。(rc3でも起こるのではないか?とちょっと思った。)

ついでに、自分の勉強用に、コードリーディングの続きをちょっとだけ。

以降、一部推測や思い込みで書いているので、正しい情報を得るには裏を取る必要があります。
SAStrutsがベースにしてるS2Container2.4では、クリエータカスタマイザというのがあります。説明はリンク先に譲ります。SAStrutsの場合はcustomizer.diconの中でactionCustomizerにActionCustomizerクラスを追加しているので、多分コンポーネント追加するときにこいつのcustomize()が呼ばれて、SAStrutsが組み立てたActionMappingやらActionForm的なものがStrutsにセットされます。

一方Strutsstruts-config.xmlでは、RequestProcessorなるクラスの実装として、S2RequestProcessorが指定されています。これはStrutsのActionServletがリクエストを受け取ったときの振る舞いを、SAStrutsが独自に定義したクラスです。
この中で、現在のリクエストにふさわしいActionを探し出すためのprocessActionCreate()なるメソッドがオーバーライドされています。オリジナルのStrutsでは、普通のActionクラスを返すみたいですが、SAStrutsでは、ActionWrapperというクラスのインスタンスを生成して、それを返しています。

で最終的にはActionWrapper#execute()が呼ばれて、その中でvalidationが呼ばれたり実行メソッドが呼ばれたりして、最後に実行メソッドの戻り値を取得します。この戻り値をもとにしてフォワード先を決めているようです。そして素のStrutsの場合、ファイルダウンロードのように自前でレスポンスを返す場合、forwardとしてはnullを返すことになっています。