DWR中转化Map类型

DWR中转化Map<String, String[]>类型
在DWR的官方文档中对Map类型的映射只有那么一句话
<dwr>
    <allow>
        ...
        <convert converter="map" match="java.util.Map"/>
    </allow>
</dwr>
但是在这种配置在处理Map<String, String[]>类型的时候总是有问题,例如
我们有一个函数如下
public Map<String, String> getParameterValues(String ,Map<String, String[]>) ...
此时我们在dwr.xml文件中这样配置

<dwr>
    <allow>
        <create creator="new" javascript="ReportDWRUtil">
            <param name="class" value="test.ReportDWRUtil" />
        </create>
        <convert converter="map" match="java.util.Map"/>
    </allow>
    <signatures>
        <![CDATA[
        import java.util.Map ;
        import java.util.List ;
        import test.ReportDWRUtil;
       
        ReportDWRUtil.getParameterValues(String, Map<String, String[]>);
        ]]>
    </signatures>
</dwr>
运行程序总是会抛出以下异常
java.lang.ClassCastException: java.lang.String
    at test.ReportDWRUtil.getParameterValues(ReportDWRUtil.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
    at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:411)
    at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:414)
    at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:273)
    at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
    at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
    at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:120)
 
现在有一种变通的方式解决这个问题
首先改变方法签名或者做一个包装,如下
public Map<String, String> getParameterValues(String ,Map<String, List<String>> map) ...
然后修改dwr.xml文件
<dwr>
    <allow>
        <create creator="new" javascript="ReportDWRUtil">
            <param name="class" value="test.ReportDWRUtil" />
        </create>
        <convert converter="map" match="java.util.Map"/>
    </allow>
    <signatures>
        <![CDATA[
        import java.util.Map ;
        import java.util.List ;
        import test.ReportDWRUtil;
       
        ReportDWRUtil.getParameterValues(String, Map<String, List>);
        ]]>
    </signatures>
</dwr>
然后再运行程序,一切OK。
 
posted @ 2007-05-19 18:22  程序员天下  阅读(200)  评论(0编辑  收藏  举报