[Tapestry4] 当心ognl的一点误用
sorphi
2007-01-05
我的一个tapestry组件,ParameterizedLink,其中有这么一个Map型参数
我经常这么使用: <component id="commentLink" type="myContrib:ParameterizedLink"> <binding name="page" value="literal:CommentView"/> <binding name="parameterMap" value="ognl:#{'cid':comment.id}"/> </component> 突然有一天,我要多给加几个参数: <binding name="parameterMap" value="ognl:#{'cid':comment.id, 'h':false, 'f':false}"/> 这个时候报错了:java.lang.ArrayStoreException 最近的stack来源于org.apache.tapestry.util.QueryParameterMap: /** * Returns the names of all parameters, sorted alphabetically. */ public String[] getParameterNames() { int count = _parameters.size(); String[] result = (String[]) _parameters.keySet().toArray(new String[count]); //this line!!!!! Arrays.sort(result); return result; } 百思不得其解啊, 查询JAVA API文档 java.lang.ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 我想我有点明白了,于是换成这样: <binding name="parameterMap" value='ognl:#{"cid":comment.id, "h":false, "f":false}'/> OK,运行正常! 原来我想当然的认为'h'会如同'cid'一样被OGNL解释成为一个String类型的对象, 如此看来是被解释成为了一个char或者Character了. 去查看ognl的文档应该可以得到线索的. |