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。
在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。