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));

みたいな感じで処理が行われて、メチャクチャになるのかも・・・
想像だから、本当は全然違う処理かもしれないけど。

ちょっと調べてみよう。