如何从服务器返回哈希映射到客户端

时间:2014-06-04 06:40:23

标签: gwt

我在服务器上有以下方法。

public HashMap<String,Set> select()
{
      HashMap <String,Set> mp = new HashMap();
     //some code
  return mp;
 }

无论我什么时候回来

 <String , Set> 

它正在进行.Failur  但我这样做了

  <String , String > 
然后它成功为什么这么开心

我正在使用gwt RPC,而我的客户端代码是

  greetingService.select(usertextbox.getText(),new AsyncCallback<HashMap<String,Set>>()
                                    {
                                        public void onFailure(Throwable caught) { 

                                            Window.alert("not done");
                                        }

                                        @Override
                                        public void onSuccess(HashMap hm) {
 Window.alert("done");
 }

服务代码

  HashMap<String, Set> select(String user);

服务实施是

public HashMap<String,Set> select(String user)
{
    try {

          Session studentDbSession = new Session("localhost",5984);

          Database db = studentDbSession.getDatabase("hello");

          Document d = db.getDocument("xyz");

          JSONArray key = d.names().discard(0).discard(0);
          for(int i=0;i<key.size();i++)
          {

              if(d.containsKey(key.get(i)))
               {
                    k=key.getString(i);

                   Set aaa=d.getJSONObject(key.getString(i)).entrySet();
                   System.out.println("----------------");
                      mp.put(k,aaa);
return mp;

}

2 个答案:

答案 0 :(得分:2)

始终尝试避免原始类型。让我分享一下示例代码。首先尝试使用此示例或验证代码的所有类。

示例代码:

RemoteService接口

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
    public HashMap<String, Set<String>> select(String input) throws IllegalArgumentException;
}

GreetingServiceAsync接口

public interface GreetingServiceAsync {
    void select(String input, AsyncCallback<HashMap<String, Set<String>>> callback);
}

GreetingServiceImpl类

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

    @Override
    public HashMap<String, Set<String>> select(String input) throws IllegalArgumentException {
        HashMap<String, Set<String>> output = new HashMap<String, Set<String>>();
        Set<String> set = new HashSet<String>();
        set.add("Hello " + input);

        output.put("greeting", set);
        return output;
    }
}

入口点类

public void greetService() {
    GreetingServiceAsync greetingService = GWT.create(GreetingService.class);

    greetingService.select("Mark", new AsyncCallback<HashMap<String, Set<String>>>() {

        @Override
        public void onSuccess(HashMap<String, Set<String>> result) {
            Window.alert(result.get("greeting").iterator().next());
        }

        @Override
        public void onFailure(Throwable caught) {
            Window.alert("fail");
        }
    });
}

的web.xml:

<servlet>
    <servlet-name>gwtService</servlet-name>
    <servlet-class>com.x.y.z.server.GWTServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>gwtService</servlet-name>
    <url-pattern>/moduleName/gwtService</url-pattern>
</servlet-mapping>

输出:

enter image description here

答案 1 :(得分:0)

您的GWT RPC调用HashMap<String, Set> select(String user);执行的操作如下:

  1. 客户端:序列化String user以便将其发送到服务器
  2. 服务器端:反序列化RPC调用,查找select(String user)的实现并执行它
  3. 服务器端:序列化返回值HashMap<String, Set>以便将其返回给客户端
  4. 客户端:反序列化返回值并调用AsyncCallback
  5. 问题在于步骤3),HashMap<String, Set>的序列化。 HashMap本身不是问题;导致错误的是Set。序列化原始类时,GWT通常假定泛型类型为<Object>。由于Object在GWT中不可序列化,因此抛出异常。

    修复:正如Braj已经提到的那样 - 给你的Set一个可序列化的泛型类型,e。 G。 Set<String>,或在客户端和服务器端可访问的包中定义您自己的接口

    public interface UserProperty extends IsSerializable{
    }
    

    并像这样更改RPC方法:

    HashMap<String, Set<UserProperty> select(String user);
    

    查看Braj的答案,了解在更改RPC方法后需要更改的所有位置的位置!