[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的文档应该可以得到线索的.
Global site tag (gtag.js) - Google Analytics