这里不涉及数组问题(即使看起来像这样):这种异常意味着Struts找不到参数的Setter:
从ParametersInterceptor文档中:
警告缺少参数
如果没有给定参数名称的设置器,则将在devMode中记录如下警告消息:
SEVERE: Developer Notification (set struts.devMode to false to disablethis
message):
Unexpected Exception caught setting ‘search’ on ‘class
demo.ItemSearchAction:
Error setting expression ‘search’ with value [‘search’, ]
Error setting expression ‘search’ with value [‘search’, ] - [unknown
location]
at
com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:201)
at
com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:178)
at
com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:152)因此,期望的行为是允许开发人员在参数名称或设置器中发现丢失的设置器或错字。
通过将JSP中不存在的元素放入Action中,可以轻松地重现此错误。
由于您的属性在模型中存在(及其设置器),并且您正在使用
ModelDriven和
paramsPrepareParamsStack,所以我认为是:
ModelDriven Interceptor
被委托处理Model对象;- 第一次致电
Parameters Interceptor
,ModelDriven Interceptor
尚未运行; - 然后,您的操作对Model对象一无所知,并尝试在Action中而不是在Model中找到参数的Setter。
- 相反,第二个拦截器在ModelDriven拦截器之后运行,并且确切知道在哪里设置参数。这就是为什么要在Action方法中正确设置参数的原因。
但是,如果这是真的,那么您应该 不能 在
prepare()方法中检索那些参数(这就是您使用此堆栈的原因…):
请尝试,然后将结果发布在此处。
解决此问题的第一件事是将第一个放置
ModelDriven Interceptor在第一个位置
ParametersInterceptor(通过复制或移动它,我不确定这两种方式都可能产生哪种副作用(如果有)情况下,您应该再次尝试并在此处进行报告)。
然后定义以下堆栈,并使用它。
<interceptor-stack name="modelParamsPrepareParamsStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="i18n"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <!-- NEW ModelDriven Position --> <interceptor-ref name="modelDriven"/> <interceptor-ref name="params"> <param name="excludeParams">^dojo..*,^struts..*,^session..*,^request..*,^application..*,^servlet(Request|Response)..*,^parameters..*,^action:.*,^method:.*</param> </interceptor-ref> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <!-- OLD ModelDriven Position --> <!--interceptor-ref name="modelDriven"/--> <interceptor-ref name="fileUpload"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">^dojo..*,^struts..*,^session..*,^request..*,^application..*,^servlet(Request|Response)..*,^parameters..*,^action:.*,^method:.*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
希望能有所帮助。


![意外的异常捕获到对“类xxx”的设置“ xxx”:设置值为['x',]的表达式'xxx'时出错 意外的异常捕获到对“类xxx”的设置“ xxx”:设置值为['x',]的表达式'xxx'时出错](http://www.mshxw.com/aiimages/31/485954.png)
