我正在使用 struts 2.1.8 和 ognl 2.7.3。
在我的动作课上,我有一个字段(地图的键:'foo','bar'):
public class TestAction extends ActionSupport {
private static Log log = LogFactory.getLog(TestAction.class);
private static final long serialVersionUID = -4684320206927996693L;
private List<Map<String, Long>> myData = new ArrayList<Map<String,Long>>();
public TestAction() {
super();
}
public String execute() {
Map<String,Long> obj1 = new HashMap<String,Long>();
obj1.put("foo", 111L);
obj1.put("bar", 112L);
Map<String,Long> obj2 = new HashMap<String,Long>();
obj2.put("foo", 551L);
obj2.put("bar", 552L);
myData.add(obj1);
myData.add(obj2);
return INPUT;
}
public String save() {
log.info("In save()");
log.info("--> " + CollectionUtil.dump(myData));
return SUCCESS;
}
public List<Map<String, Long>> getMyData() {
return myData;
}
public void setMyData(List<Map<String, Long>> myData) {
this.myData = myData;
}
}
我可以在 JSP 页面上显示内容,但是当我尝试提交回操作时出现转换错误。
JSP 代码为:
<s:form action="Test_save">
<s:if test="myData != null && myData.size > 0">
<s:iterator value="myData" status="status">
<tr>
<td>
<s:textfield name="myData[%{#status.index}].foo" />
</td>
<td>
<s:textfield name="myData[%{#status.index}].bar" />
</td>
</tr>
</s:iterator>
</s:if>
<s:submit value="Submit"></s:submit>
</s:form>
以下是日志文件中的输出:
[75913] 调试 com.opensymphony.xwork2.interceptor.StaticParametersInterceptor 调试 -> 设置静态参数 {}
[75913] 调试 com.opensymphony.xwork2.interceptor.ParametersInterceptor 调试 -> 设置参数 myData[0].bar => [112] myData[0].foo => [111] myData[1].bar => [552 ] myData[1].foo => [551]
[75917] 调试 com.opensymphony.xwork2.conversion.impl.XWorkConverter 调试 -> 属性:CreateIfNull_myData
[75918] 调试 com.opensymphony.xwork2.conversion.impl.XWorkConverter 调试 -> 类:com.mcw.web.actions.TestAction
[75923] 警告 com.opensymphony.xwork2.ognl.OgnlValueStack 警告 -> 错误设置值
java.util.Map - 类:java.lang.ClassFile:Class.javaMethod:newInstance0 行:340 - java/lang/Class.java:340:-1
在 com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor.getProperty(XWorkListPropertyAccessor.java:102)
在 ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2210)
在 ognl.ASTProperty.getValueBody(ASTProperty.java:114)
在 ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
在 ognl.SimpleNode.getValue(SimpleNode.java:258)
在 ognl.ASTChain.setValueBody(ASTChain.java:222)
在 ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
在 ognl.SimpleNode.setValue(SimpleNode.java:301)
在 ognl.Ognl.setValue(Ognl.java:737)
……
引起:java.lang.InstantiationException:java.util.Map
在 java.lang.Class.newInstance0(Class.java:340)
在 java.lang.Class.newInstance(Class.java:308)
在 com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:119)
在 com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor.getProperty(XWorkListPropertyAccessor.java:100)
... 82 更多
我错过了什么?