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(); }
がポイントだろうというのは気がついていたので、
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再起動しても、クリーンビルドしなおしても、正常動作する。
前はなにやってもだめだったのに…。