struts2とseasar2を使ってアプリ作成(準備その3)~警告WSSR0008

前回の続き。
こういうメッセージが出たときの対処について。

警告: ~~Actionのプロパティ(container)が見つからないので設定をスキップします

メッセージの意味

このメッセージの内容を調べてみると、s2-framework-2.4.xx.jarのSSRMessages_ja.propertiesにこの1行があります。

WSSR0008={0}のプロパティ({1})が見つからないので設定をスキップします

英語のメッセージだと(SSRMessages.properties)

WSSR0008=Skip setting property, because property({1}) of {0} not found

これ(WSSR0008
Seasar2コンポーネントのプロパティに DI することができなかった」ということらしい。
つまり、containerプロパティにDIしようとしたができなかった。

何をDIしようとしていたかというと、
まず、com.opensymphony.xwork2.ActionSupportには
public void setContainer(com.opensymphony.xwork2.inject.Container container)
が定義されている。
一方、Seasar2の立場から言うと、暗黙的なコンポーネントにあるように
org.seasar.framework.container.S2Container container;
に自動的にセットをしようとしている。
ここでずれが生じているために、警告メッセージがでています。
ここ、ちょっと勘違いでsetCoutainerという名前だからダメなわけではなく、型がインターフェースの場合にDIしようとしているっぽい

対処

一言で言うと、「ActionSupportを使わない」
以下のように書き換えます。
これを

import com.opensymphony.xwork2.ActionSupport;

public class SeasarTestAction extends ActionSupport {

こう

import com.opensymphony.xwork2.Action;
public class SeasarTestAction implements Action {

これで警告は出なくなるはずです。
とはいっても、ActionSupportは何かと便利でもあるのでsetContainerの形を変えて作り直すのもいいと思います。

関連した現象

上の暗黙的なコンポーネントのように、ActionSupportを継承したアクションクラスに下記のように定義してもcontainerにはDIされません。
requestプロパティにはDIされます。

	public S2Container container;
	public HttpServletRequest request;

以上