Java代码:public void testSignaturesMapArgs(Map map){
   Set<Entry<Object,Object>> entrys = map.entrySet();
   for(Entry entry : entrys){
System.out.println(entry.getKey() + " -- " + entry.getKey().getClass().getName());
System.out.println(entry.getValue() + " -- " + entry.getValue().getClass().getName());
    }
    System.out.println("-------------testSignaturesMapArgs---------------");
}

public void testObjectArgs(Object obj){
    System.out.println(obj + " -- " + obj.getClass().getName());
    System.out.println("-------------testObjectArgs----------------------");
}JavaScript代码:function testSignaturesMapArgs(){
   var arg = {
        "_userBean":{userId:"1",userName:"Go",userPass:"123"}
    };
   server.testSignaturesMapArgs(arg);
}

function testObjectArgs(){
   server.testObjectArgs("Go");
}dwr.xml配置文件:<dwr>
<allow>
<!-- 
creator:对象创建策略。
javascript:在JavaScript中使用时的对象名称。
scope:作用域。
 -->
<create creator="new" javascript="server" scope="script">
<param name="class">org.dwr.server.Server</param>
</create>
<!-- 
converter:已经预定义过了的转换策略,例如:bean转换策略。
match:需要转换的符合该匹配条件的JavaBean的完整类名,可以使用通配符"*"。
javascript:在JavaScript中使用时的类名(new User())。
 -->
<convert converter="bean" match="org.dwr.bean.UserBean"/>
</allow>
<!-- 
对方法参数的额外描述
 -->
<signatures>
<![CDATA[
import java.util.List;
import java.util.Map;
import org.dwr.server.Server;
import org.dwr.bean.UserBean;

Server.testSignaturesListArgs(List<UserBean> _dwrList);
Server.testSignaturesMapArgs(Map<String,UserBean> _dwrMap);
Server.testObjectArgs(String _dwrString);
]]>
</signatures>
</dwr>出现的问题是在传参的时候,调用参数为Map类型的方法时,输出的Map的值为:
2011-02-18 09:12:03,0  WARN (org.directwebremoting.util.LocalUtil:1355) - Missing type info for (method=public void org.dwr.server.Server.testSignaturesMapArgs(java.util.Map), parameter: 0). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml
_userBean -- java.lang.String
{userId:reference:c0-e2, userName:reference:c0-e3, userPass:reference:c0-e4} -- java.lang.String
-------------testSignaturesMapArgs---------------
而在调用参数为Object类型的方法时干脆就报错弹出Error对话框。并且输出:
2011-02-18 09:13:13,890  WARN (org.directwebremoting.extend.Call:205) - No methods called class org.dwr.server.Server.testObjectArgs' are applicable for the passed parameters.
不知道为什么?我试过了,调用返回Map、Object的Java方法就算不使用<signatures>标签进行额外的描述也是可以的。

解决方案 »

  1.   

    自定义一个DWR的类型转换器不知可否?
      

  2.   

    我没实际用过,只是猜测:
    Missing type info for (method=public void org.dwr.server.Server.testSignaturesMapArgs(java.util.Map), parameter: 0). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml它是报丢失类型信息,也就是参数Map的类型信息,dwr可能是需要的,同时与你后面的描述不矛盾,因为你说可以的是返回值为Map Object等,猜测它对返回值不作额外要求,对方法参数有更严格要求
      

  3.   

    是呀,我测试过了的。返回值为Map或者Object就不需要使用signatures标签进行描述了。但是参数确实是要,但是我明明使用了signatures标签进行描述啊,但是他还是报warn,并且UserBean没有被转换。请问这种情况我该怎么实现?我的testSignaturesMapArgs()的额外描述信息应该没错的吧?
      

  4.   

    建议使用JSON进行数据传递复杂对象DWR支持有一定难度,之前做过 List<List<Map<String, List<Object>>>>类型的数据传递DWR解决不了,用的JSON也不难用,还很爽
      

  5.   

    这哥们,你测试的那个蛮BT的哈 我就这么点简单的 他貌似也解决不了。我看他们以前的帖子或者文章描述过使用Map作为参数。我的配置和那个描述的没有区别,但是就是不知道为什么。难道版本不同,DWR3.0的BUG?
    郁闷啊在等等吧希望有人遇到过。
      

  6.   

    你用的是RC1,还是RC2?可能在RC1不会有这个问题