日期:2014-05-17  浏览次数:20837 次

DWR3.0中在Js客户端调用参数类型为Map、Object的Java方法时出现转换问题
Java代码:
Java code

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代码:
JScript code

function testSignaturesMapArgs(){
   var arg = {
            "_userBean":{userId:"1",userName:"Go",userPass:"123"}
        };
   server.testSignaturesMapArgs(arg);
}
        
function testObjectArgs(){
   server.testObjectArgs("Go");
}


dwr.xml配置文件:
XML code

<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>标签进行额外的描述也是可以的。

------解决方案--------------------
我没实际用过,只是猜测:
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等,猜测它对返回值不作额外要求,对方法参数有更严格要求
------解决方案--------------------
<