S2.3.2→S2.3.4アップデート

してみたところ、S2.3.2 + S2Struts1.2RC2で作っていたサンプルJPetstoreで

org.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(mainPage)が見つかりません
	org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponentDef(S2ContainerBehavior.java:84)
	org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponent(S2ContainerBehavior.java:78)
	org.seasar.framework.container.impl.S2ContainerBehavior.acquireFromGetComponent(S2ContainerBehavior.java:42)
	org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:103)
	pdstruts.util.DiconUtil.getComponent(DiconUtil.java:46)

のようにコケるようになってしまいました。
っていうか、結構前に試してだめだったんで放置してたんですが、もうそろそろ2.4の時期なので最新版に追いつきたいなぁと思いまして。

S2.3.2 + S2Struts1.2RC2に戻すと全く問題なく動くんです。
何か変わりましたっけ?
S2Strutsを1.2.0にしても同じくエラーでした。

うーん。困った困った。

追記

3) SingletonS2ContainerFactory.getContainer()を呼び出す前に、

   if (! SingletonS2ContainerFactory.hasContainer()) {
      SingletonS2ContainerFactory.init();
    } 

を実行
エラー - Seasar - SourceForge.JP

がポイントだろうというのは気がついていたので、

public class DiconUtil {
    // ...省略
    private static S2Container getContainer() {
        if (!SingletonS2ContainerFactory.hasContainer()) {
            SingletonS2ContainerFactory.init();
        } 
        return SingletonS2ContainerFactory.getContainer();
    }
}

とやってみたんですが、これでも同じでした。
で、仕方ないのでデバッグ情報をとりがてら

public class DiconUtil {
    // ...省略
    public static Object getComponent(Object key) {
        try {
            System.out.println("★" + getContainer().getComponent(key));
        } catch (Exception e) {
            e.printStackTrace();
            getContainer().init();
            try {
                System.out.println("★" + getContainer().getComponent(key));
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
        return getContainer().getComponent(key.toString());
    }
}

としてみたら、うまいこと初期化されました。

そこで疑問。

  • 今までS2ContainerServletでこの初期化がされていたと思ってるんですが、S2.3.4からなぜ効かなくなったのか?
  • S2Containerが初期化されていないことを確認するコードは
   SingletonS2ContainerFactory.hasContainer()

じゃだめなのか?

今までと変わらずweb.xmlで

  <servlet>
    <servlet-name>s2container</servlet-name>
    <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

と書いてるんですけどねぇ。

更に追記

さっきのcatchで無理やりinit()ってやつで成功した後、元に戻しても正常動作するようになった…。
なんでなんで?
ずーっと悩んでたのに。わけわからん。

Tomcat再起動しても、クリーンビルドしなおしても、正常動作する。
前はなにやってもだめだったのに…。