読者です 読者をやめる 読者になる 読者になる

T2のSeasar2 Adapterを使ってみる

T2のSeasar2 Adapterを使おうとしてハマった。
以下の組み合わせで使おうと思ったのだけど、T2のS2Adapterはサンプルを見るとS2Containerの2.3.23を使っているようで、最新の2.4.33を使おうとすると起動時にエラーがでる。これを解決しようと2.3.23に落とすと今度はS2JDBC-Genで生成していたコードでコンパイルエラーが出る・・・。

さてどうしたものか・・・。とりあえずS2Containerは使わないでSimpleContainerAdapterでやっておくかなぁ。


■試そうとした組み合わせ
T2+S2Container+S2JDBC(S2JDBC-Gen)+Mayaa


■起動時のエラー

javax.servlet.ServletException: javax.servlet.ServletException: java.lang.NoSuchMethodError: org.seasar.framework.container.factory.SingletonS2ContainerFactory.setServletContext(Ljavax/servlet/ServletContext;)V
at org.t2framework.t2.filter.T2Filter.init(T2Filter.java:97)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: javax.servlet.ServletException: java.lang.NoSuchMethodError: org.seasar.framework.container.factory.SingletonS2ContainerFactory.setServletContext(Ljavax/servlet/ServletContext;)V
at org.t2framework.t2.filter.Initializer.getContainerAdapterClass(Initializer.java:65)
at org.t2framework.t2.filter.Initializer.execute(Initializer.java:41)
at org.t2framework.t2.filter.T2Filter.init(T2Filter.java:86)
... 18 more
Caused by: java.lang.NoSuchMethodError: org.seasar.framework.container.factory.SingletonS2ContainerFactory.setServletContext(Ljavax/servlet/ServletContext;)V
at org.t2framework.t2.adapter.Seasar2Adapter.init(Seasar2Adapter.java:67)
at org.t2framework.t2.adapter.Seasar2Adapter.init(Seasar2Adapter.java:79)
at org.t2framework.t2.filter.Initializer.getContainerAdapterClass(Initializer.java:63)

エラーはSingletonS2ContainerFactorysetServletContextがないとのことだが、ChangeLogをみるとちょうど2.4になるときにこのメソッド無くなっている。

http://svn.seasar.org/browse/trunk/seasar2/s2-framework/src/main/java/org/seasar/framework/container/factory/SingletonS2ContainerFactory.java?root=s2container&r1=333&r2=448


[追記]
Seasar2Adapter#initを以下のように修正することで、2.4.33でも動作することを確認したけど、これでいいのか不安だなぁ。

■修正前

public void init() {
  SingletonS2ContainerFactory.setServletContext(servletContext);
  SingletonS2ContainerFactory.init();
}


■修正後

public void init() {
  ComponentDeployerFactory.setProvider(new ExternalComponentDeployerProvider());
  ExternalContext extCtx = new HttpServletExternalContext();
  extCtx.setApplication(servletContext);
  SingletonS2ContainerFactory.setExternalContext(extCtx);
  ExternalContextComponentDefRegister extCtxComponentDefRegister = new HttpServletExternalContextComponentDefRegister();
 SingletonS2ContainerFactory.setExternalContextComponentDefRegister(extCtxComponentDefRegister);
  SingletonS2ContainerFactory.init();
}


(参考)
SingletonS2ContainerFactory#init() - 大樹の色々日記