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表示存在异常。PrintCapture.printStackTrace()
您的服务存在异常。不,没有异常我在jety 500的开发模式上收到一个错误代码-POST/singledoc/greet(127.0.0.1)57字节500表示调用在服务器上失败。有关详细信息,请参阅服务器日志。serviceImpl类中存在一些异常。