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;
以上