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

Gwt 如何将哈希映射从服务器返回到客户端,gwt,Gwt,我在服务器上有以下方法 public HashMap<String,Set> select() { HashMap <String,Set> mp = new HashMap(); //some code return mp; } public HashMap select() { HashMap mp=新的HashMap(); //一些代码 返回mp; } 当我想回来的时候 <String , Set> 它正在继续

我在服务器上有以下方法

public HashMap<String,Set> select()
{
      HashMap <String,Set> mp = new HashMap();
     //some code
  return mp;
 }
public HashMap select()
{
HashMap mp=新的HashMap();
//一些代码
返回mp;
}
当我想回来的时候

 <String , Set> 

它正在继续 但我做到了

  <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");
 }
greetingService.select(usertextbox.getText(),new AsyncCallback())
{
失败时的公共无效(可丢弃){
窗口。警报(“未完成”);
}
@凌驾
成功时的公共无效(HashMap hm){
窗口。警报(“完成”);
}
服务代码为

  HashMap<String, Set> select(String user);
HashMap选择(字符串用户);
服务实现是

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;
公共哈希映射选择(字符串用户)
{
试一试{
会话studentDbSession=新会话(“localhost”,5984);
Database db=studentDbSession.getDatabase(“hello”);
文档d=db.getDocument(“xyz”);
JSONArray key=d.names().discard(0).discard(0);

对于(int i=0;i始终尝试避免Raw类型。让我与您分享一个示例代码。首先在您结束时使用此示例进行尝试,或者验证代码的所有类

示例代码: 远程服务接口

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
    public HashMap<String, Set<String>> select(String input) throws IllegalArgumentException;
}
public interface GreetingServiceAsync {
    void select(String input, AsyncCallback<HashMap<String, Set<String>>> callback);
}
@RemoteServiceRelativePath(“问候”)
公共接口欢迎服务扩展了RemoteService{
公共哈希映射选择(字符串输入)抛出IllegalArgumentException;
}
GreetingServiceAsync接口

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
    public HashMap<String, Set<String>> select(String input) throws IllegalArgumentException;
}
public interface GreetingServiceAsync {
    void select(String input, AsyncCallback<HashMap<String, Set<String>>> callback);
}
公共接口GreetingServiceAsync{
void select(字符串输入,异步回调);
}
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;
    }
}
公共类GreetingServiceImpl扩展RemoteServiceServlet实现GreetingService{
@凌驾
公共哈希映射选择(字符串输入)抛出IllegalArgumentException{
HashMap输出=新的HashMap();
Set=newhashset();
set.add(“Hello”+输入);
输出。put(“问候语”,set);
返回输出;
}
}
入门级

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");
        }
    });
}
public void greetService(){
GreetingServiceAsync greetingService=GWT.create(greetingService.class);
greetingService.select(“Mark”,new AsyncCallback()){
@凌驾
成功时的公共void(哈希映射结果){
Window.alert(result.get(“greeting”).iterator().next());
}
@凌驾
失败时的公共无效(可丢弃){
窗口警报(“失败”);
}
});
}
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>

GWT服务
com.x.y.z.server.gwtservicepimpl
GWT服务
/模块名称/GWT服务
输出:


您的GWT RPC调用的
HashMap select(字符串用户);
的作用如下:

  • 客户端:序列化
    字符串用户
    ,以便将其发送到服务器
  • 服务器端:反序列化RPC调用,找到
    select(String user)
    的实现并执行它
  • 服务器端:序列化返回值
    HashMap
    ,以便将其返回给客户端
  • 客户端:反序列化返回值并调用AsyncCallback
  • 问题在于步骤3),序列化
    HashMap
    。HashMap本身不是问题所在;是
    导致了错误。序列化原始类时,GWT通常假定泛型类型为
    。由于
    对象
    在GWT中不可序列化,因此会引发异常

    Fix:正如Braj已经提到的——给你的集合一个可序列化的泛型类型,例如
    Set
    ,或者在一个包中定义你自己的接口,这个包可以从客户端和服务器端访问

    并按如下方式更改RPC方法:

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

    hashMap您是否遇到任何异常?您是如何做到的?共享一些代码。没有例外只是发生了故障您是否正在使用GWT RPC?共享serviceImpl、serviceAsync和客户端代码的代码请阅读编辑过的问题您在说什么故障?您能再解释一下故障术语吗?我收到了一个警告failIt表示存在异常。Print
    Capture.printStackTrace()
    您的服务存在异常。不,没有异常我在jety 500的开发模式上收到一个错误代码-POST/singledoc/greet(127.0.0.1)57字节500表示调用在服务器上失败。有关详细信息,请参阅服务器日志。serviceImpl类中存在一些异常。