POJOのActionFormをsessionスコープでってもしかしてダメかも
調べてて気になったこと。
BeanValidatorFormが利用するWrapDynaBeanがSerializableを実装していないところ。
もしかしてシリアライズしようとしたらエラーになっちゃうとか・・・
ちょっとテストを作成
public class JikkenTest extends TestCase { public void testSerializeBeanValidatorForm() { BeanValidatorForm from = new BeanValidatorForm("文字列"); BeanValidatorForm to = (BeanValidatorForm) deepCopy(from); assertEquals("文字列", ((WrapDynaBean) to.getDynaBean()).getInstance()); } public Object deepCopy(Object o) { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = null; try { out = new ObjectOutputStream(bout); out.writeObject(o); } catch (IOException e) { throw new RuntimeException("out ", e); } finally { if (out != null) { try { out.close(); } catch (IOException e) { } } } byte[] bytes = bout.toByteArray(); Object newObject = null; ObjectInputStream in = null; try { in = new ObjectInputStream(new ByteArrayInputStream(bytes)); newObject = in.readObject(); } catch (IOException e) { throw new RuntimeException("in ", e); } catch (ClassNotFoundException e) { throw new RuntimeException("in ", e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } return (Serializable) newObject; } }
エラーが発生
java.lang.RuntimeException: out at study.xxx.test.JikkenTest.deepCopy(JikkenTest.java:62) at study.xxx.test.JikkenTest.testSerializeBeanValidatorForm(JikkenTest.java:50) 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:324) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186) Caused by: java.io.NotSerializableException: org.apache.commons.beanutils.WrapDynaBean at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1332) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1304) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1247) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278) at study.xxx.test.JikkenTest.deepCopy(JikkenTest.java:60) ... 14 more
WrapDynaBeanが足をひっぱてる・・・
やっぱ、S2ContatinerでPOJOActionFormのインスタンスとスコープを決めて、struts-config.xml action-mappingのscope属性は無視がいいのかも。
うーん。
ちょっと思ったんだけど、もうひと工夫必要かも。
S2Containerが
request.setAttribute("logonForm", pojoForm);
を行った後にStrutsが
request.setAttribute("logonForm", new BeanValidatorForm(pojoForm));
みたいな感じで処理が行われて、メチャクチャになるのかも・・・
想像だから、本当は全然違う処理かもしれないけど。
ちょっと調べてみよう。