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)
エラーはSingletonS2ContainerFactoryのsetServletContextがないとのことだが、ChangeLogをみるとちょうど2.4になるときにこのメソッド無くなっている。
[追記]
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(); }