[Seasar-user:7084] [Seasar2+S2Struts]Form のスコープがリクエストの場合にIllegalPropertyRuntimeException

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 4月 6日 (金) 16:54:01 JST


お初にお目にかかります。田村と申します。

現在、S2Container+S2Struts+S2Daoの組み合わせで開発をしております。
下記のようなエラーが発生し、どのように対応しようかと考えているところです。
何か良い方法がありましたらアドバイス頂けないでしょうか。

--------------------------------------------------
S2Containerを2.3.15から2.4.9へバージョンアップすると、画面遷移時に
IllegalPropertyRuntimeExceptionが発生してしまいます。
以下はトレースログです。

org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラ
ス
(xx.xx.xxxxxxxxxx.xxx.xxx.xxxxx.xxxxxxx.action.impl.Sv0101d01ActionImpl$$EnhancedByS2AOP$$722969)
のプロパティ(sv0101d01Form)の設定に失敗しました。理由は
java.lang.IllegalArgumentException: argument type mismatch
        at 
org.seasar.framework.beans.impl.PropertyDescImpl.setValue(PropertyDescImpl.java:127)
        at 
org.seasar.framework.container.assembler.AbstractBindingTypeDef.setValue(AbstractBindingTypeDef.java:233)
        at 
org.seasar.framework.container.assembler.AbstractBindingTypeDef.bindAuto(AbstractBindingTypeDef.java:167)
        at 
org.seasar.framework.container.assembler.BindingTypeShouldDef.doBind(BindingTypeShouldDef.java:53)
        at 
org.seasar.framework.container.assembler.AbstractBindingTypeDef.bind(AbstractBindingTypeDef.java:73)
        at 
org.seasar.framework.container.assembler.AutoPropertyAssembler.assemble(AutoPropertyAssembler.java:65)
        at 
org.seasar.framework.container.deployer.RequestComponentDeployer.deploy(RequestComponentDeployer.java:62)
        at 
org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:98)
        at 
org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:124)
        at 
org.seasar.struts.pojo.PojoProcessAction.execute(PojoProcessAction.java:61)
        at 
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
        at 
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
        at 
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
        at 
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
        at 
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
        at 
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
        at 
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
        at 
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
        at 
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
xx.xx.xxxxxxxxxx.xxx.xx.xxx.MsgServletFilter.doFilter(MsgServletFilter.java:53)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.struts.filter.S2StrutsFilter.doFilter(S2StrutsFilter.java:42)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)


基本的に2.4の新機能等は使わず、デプロイもノーマルモードで行っています。
コードを追ってみたところ、どうやらFormのスコープをリクエストにした場合、
BeanValidatorFormでラッピングされているためにActionと上手くバインドできて
いないようです。
以前のバージョンでは条件判定で回避されていましたが、新しいバージョンでは上
手くいっていないようです。
以下は、問題部分と思われるコードです。

[S2Container 2.4.9]
・org.seasar.framework.container.assembler.AbstractBindingTypeDef;

    protected boolean bindAuto(ComponentDef componentDef,
            PropertyDesc propertyDesc, Object component) {

        S2Container container = componentDef.getContainer();
        String propName = propertyDesc.getPropertyName();
        Class propType = propertyDesc.getPropertyType();
        if (container.hasComponentDef(propType)) {
            ComponentDef cd = container.getComponentDef(propType);
            if (cd.getComponentName() != null
                    && (cd.getComponentName().equalsIgnoreCase(propName) 
|| StringUtil
                            .endsWithIgnoreCase(cd.getComponentName(),
                                    ContainerConstants.PACKAGE_SEP + 
propName))) {
                Object value = getValue(componentDef, propType, component,
                        propName);
                // このsetValueが呼び出されて例外が発生します
                setValue(componentDef, propertyDesc, component, value);
                return true;
            }
        }
        if (container.hasComponentDef(propName)) {
            Object value = getValue(componentDef, propName, component, 
propName);
            if (propType.isInstance(value)) {
                setValue(componentDef, propertyDesc, component, value);
                return true;
            }
        }
        if (BindingUtil.isAutoBindable(propType)) {
            if (container.hasComponentDef(propType)) {
                Object value = getValue(componentDef, propType, component,
                        propName);
                setValue(componentDef, propertyDesc, component, value);
                return true;
            }
            if (propType.isAssignableFrom(ComponentDef.class)) {
                setValue(componentDef, propertyDesc, component, 
componentDef);
                return true;
            }
        }
        if (BindingUtil.isAutoBindableArray(propType)) {
            Class clazz = propType.getComponentType();
            Object[] values = container.findAllComponents(clazz);
            if (values.length > 0) {
                setValue(componentDef, propertyDesc, component, values);
                return true;
            }
        }
        return false;
    }


比較のため、以前のバージョンのコードも載せておきます。

[S2Container 2.3.15]
・org.seasar.framework.container.assembler.AbstractBindingTypeDef;

    protected boolean bindAuto(ComponentDef componentDef,
            PropertyDesc propertyDesc, Object component) {

        S2Container container = componentDef.getContainer();
        String propName = propertyDesc.getPropertyName();
        Class propType = propertyDesc.getPropertyType();
        if (container.hasComponentDef(propName)) {
            Object value = container.getComponent(propName);
            if (propType.isInstance(value)) {
                setValue(componentDef, propertyDesc, component, value);
                return true;
            }
        }
        if (BindingUtil.isAutoBindable(propType)) {
            if (container.hasComponentDef(propType)) {
                Object value = container.getComponent(propType);
                setValue(componentDef, propertyDesc, component, value);
                return true;
            }
            if (propType.isAssignableFrom(ComponentDef.class)) {
                setValue(componentDef, propertyDesc, component, 
componentDef);
                return true;
            }
        }
        return false;
    }
--------------------------------------------------

Formをセッションにしてしまえばとりあえず通るのですが、できればリクエストで
いきたいと考えています。

よろしくお願い致します。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/seasar-user/attachments/20070406/4c543787/attachment.html 


Seasar-user メーリングリストの案内