[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 メーリングリストの案内