S2Struts1.2EA2突入
というわけで、S2Strutsです。
id:yuki_neko_nyanさんの[Seasarする] - 猫的怠惰Daysを参考にまずはとっかかりを、と思ってたらいきなり問題に遭遇。
今のS2Struts1.2EA2実装ってSeasar4 EA1を前提に実装されているみたいで、こないだ出たS2.3RC1だとエラーが出てしまって、一緒に動かせないのです。
S4EA1に入れ替えてみたんですが、自動登録方法が違うみたいでdiconファイルがエラーになったりしてイヤンなので、S2Struts側で対応させてしまうことにしました。
で、これ↓。
Index: S2StrutsInitializer.java =================================================================== RCS file: /cvsroot/seasar/s2-struts/src/main/org/seasar/struts/S2StrutsInitializer.java,v retrieving revision 1.12 diff -u -r1.12 S2StrutsInitializer.java --- S2StrutsInitializer.java 5 Sep 2005 16:22:53 -0000 1.12 +++ S2StrutsInitializer.java 13 Oct 2005 16:34:27 -0000 @@ -12,8 +12,9 @@ import org.apache.struts.config.ControllerConfig; import org.apache.struts.config.ModuleConfig; import org.seasar.framework.container.ComponentDef; -import org.seasar.framework.container.ContainerConstants; +import org.seasar.framework.container.InstanceDef; import org.seasar.framework.container.S2Container; +import org.seasar.framework.container.deployer.InstanceDefFactory; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; import org.seasar.framework.container.impl.ComponentDefImpl; import org.seasar.framework.util.ClassUtil; @@ -55,7 +56,7 @@ S2Container container = SingletonS2ContainerFactory.getContainer(); regist(container, ActionFactory.class, ActionFactoryImpl.class); regist(container, ComponentNameCreator.class, ComponentNameCreatorImpl.class); - regist(container, MessageFacade.class, MessageFacadeImpl.class, ContainerConstants.INSTANCE_REQUEST); + regist(container, MessageFacade.class, MessageFacadeImpl.class, InstanceDef.REQUEST_NAME); regist(container, AutoStrutsConfigRule.class, AutoStrutsConfigRuleImpl.class); regist(container, ZeroConfigActionRule.class, ZeroConfigActionRuleImpl.class); regist(container, ZeroConfigActionFormRule.class, ZeroConfigActionFormRuleImpl.class); @@ -72,7 +73,7 @@ private static void regist(S2Container container, Class interfaceClass, Class component, String instanceType) { ComponentDef cd = new ComponentDefImpl(component); - cd.setInstanceMode(instanceType); + cd.setInstanceDef(InstanceDefFactory.getInstanceDef(instanceType)); regist(container, interfaceClass, cd); } @@ -110,7 +111,7 @@ if (actionClass.isInterface() == false) { ComponentDef def = new ComponentDefImpl(actionClass); if (actionClass.equals(ProxyAction.class) == false) { - def.setInstanceMode(ContainerConstants.INSTANCE_PROTOTYPE); + def.setInstanceDef(InstanceDefFactory.PROTOTYPE); } regist(container, actionClass, def); } @@ -151,7 +152,7 @@ String processorClassName = controllerConfig.getProcessorClass(); Class processorClass = ClassUtil.forName(processorClassName); if (ExternalRequestProcessor.class.isAssignableFrom(processorClass)) { - regist(container, ExternalRequestProcessor.class, processorClass, ContainerConstants.INSTANCE_PROTOTYPE); + regist(container, ExternalRequestProcessor.class, processorClass, InstanceDef.PROTOTYPE_NAME); } }
クラス1つだけです。要はinstance属性のところのAPIに差異があるみたいなので3〜4箇所を修正しただけです。
で、これをAntでビルド。
〜(省略)〜 copyDocs: BUILD FAILED D:\Hoge\Develop\eclipse-workspace\s2-struts\build.xml:65: The following error occurred while executing this line: D:\Hoge\Develop\eclipse-workspace\s2-struts\build.xml:83: The following error occurred while executing this line: D:\Hoge\Develop\eclipse-workspace\s2-struts\build.xml:87: D:\Hoge\Develop\eclipse-workspace\seasar-www not found. Total time: 48 seconds
とか言われるけど、lib配下を見たら新しいjarができてたので、エラーは無視。
早速、jarファイルを入れ替えて実行してみると…。
java.lang.NoSuchMethodError: org.apache.commons.beanutils.WrapDynaBean.getInstance()Ljava/lang/Object; org.seasar.struts.interceptors.ProcessPojoFormInterceptor$SerializeBeanValidatorForm.<init>(ProcessPojoFormInterceptor.java:169) org.seasar.struts.interceptors.ProcessPojoFormInterceptor.createPojoForm(ProcessPojoFormInterceptor.java:109) org.seasar.struts.interceptors.ProcessPojoFormInterceptor.processPojoForm(ProcessPojoFormInterceptor.java:70) 〜(省略)〜
どうやら、commons-beans.jarのバージョンが違う模様。
最新のcommons-beans-1.6.1.jarを入れてましたが、素直にS2Struts同梱のcommons-beans.jarと置換して再実行すると…。
無事にブラウザに「Hello」と表示されました。ふう。
本格的に触り始めるのは明日から。