我在服务器上有以下方法。
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;
}
答案 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>
输出:
答案 1 :(得分:0)
您的GWT RPC调用HashMap<String, Set> select(String user);
执行的操作如下:
String user
以便将其发送到服务器select(String user)
的实现并执行它HashMap<String, Set>
以便将其返回给客户端问题在于步骤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方法后需要更改的所有位置的位置!