Struts2 Action中以自定义对象为键的Map如何配置请求参数
问题描述
请参考如下AnswerAction定义:
public class AnswerAction extends CommonAction implements SessionAware { private CaseNumbering caseNumbering; (...) }
以及FormCaseNumbering定义:
public class FormCaseNumbering implements CaseNumbering { private Duplicable innermostElement; Map<Duplicable, Integer> caseNumbersOfDuplicableFormElements = new HashMap<>(); (...) }
还有DuplicableFormElement定义:
public class DuplicableFormElement implements Duplicable { protected int id; protected boolean duplicable; }
该Struts2应用通过Spring注入Bean,配置如下:
<bean id="caseNumbering" scope="prototype" class="model.FormCaseNumbering"> <property name="innermostElement" ref="duplicableFormElement"></property> </bean> <bean id="answerAction" class="actions.AnswerAction" scope="prototype" autowire="byName"> <property name="caseNumbering" ref="caseNumbering"/> </bean>
需求
如何构造请求参数,为Action的caseNumbering属性中的Map填充一条键为duplicableElement.id=6、值为Integer=1的记录?
已尝试方案
由于caseNumbering通过Spring注入,可正常填充innermostElement属性,如下配置是生效的:
(MockHttpServletRequest)request.setParameter("caseNumbering.innermostElement.id","9");
但使用如下参数配置时抛出错误:
(MockHttpServletRequest)request.setParameter("caseNumbering.caseNumbersOfDuplicableFormElements[6]","1");
错误提示为:
字段"caseNumbering.caseNumbersOfDuplicableFormElements[6]"的值无效。
我还添加了AnswerAction-conversion.properties配置文件,内容如下,仍未生效:
Key_caseNumbering.caseNumbersOfDuplicableFormElements=model.DuplicableFormElement KeyProperty_caseNumbering.caseNumbersOfDuplicableFormElements=id Element_caseNumbering.caseNumbersOfDuplicableFormElements=java.lang.Integer CreateIfNull_caseNumbering.caseNumbersOfDuplicableFormElements=true
请问在Struts2中无需开发自定义转换器的前提下,该需求是否可实现?正确的请求参数应该如何编写?
解答
无需开发自定义转换器即可实现该需求,你现有配置已经基本正确,仅需要调整参数写法、补充两个必要检查项即可。
核心错误原因
Struts2对不同类型的集合参数有不同的语法要求:
- 数组、List,以及键为基础类型/字符串的Map,使用方括号
[]传参 - 键为自定义对象的Map,必须使用圆括号
()包裹KeyProperty对应的匹配值,你之前使用方括号的写法不符合语法要求
正确实现步骤
- 修正请求参数写法:将方括号替换为圆括号即可,写法如下:
(MockHttpServletRequest)request.setParameter("caseNumbering.caseNumbersOfDuplicableFormElements(6)","1");
- 两个必查项(如果改完参数还报错可以核对):
- 确保
DuplicableFormElement类有public无参构造方法,且id字段提供了public的getter、setter方法,Struts2需要反射创建实例并赋值id属性 - 确保
AnswerAction-conversion.properties文件和AnswerAction类放在同一个包路径下,文件名大小写完全匹配
你之前编写的转换配置内容是完全正确的,不需要修改。
内容的提问来源于stack exchange,提问作者mmalmeida
相关产品推荐
相关产品推荐

