我的后端服务器函数返回一个json对象列表 呼叫者,召集者。
我想使用JsonRequestBuilder与此后端函数进行交互
我以这种方式定义了AsyncCallback
class MyCallBack extends AsyncCallback<List<MyObject>> {
但是,JsonpRequestBuilder没有这个声明AsyncCallback因为泛型
类型以<T extends JavaScriptObject
&gt;为界。列表<MyObject
&GT;不满足这个要求。
你对这个问题有什么建议吗?
答案 0 :(得分:5)
请参阅docs for JsonpRequestBuilder
中的此示例class Feed extends JavaScriptObject {
protected Feed() {}
public final native JsArray<Entry> getEntries() /*-{
return this.feed.entry;
}-*/;
}
响应是一个包含JS数组的JavaScriptObject,而不是响应是直接List
,而JSObject通过JSNI getEntries()
方法公开。
如果JSON响应没有为数组命名(如var feed = [...]
),那么我相信你可以return this
,但你必须尝试它才能确定。希望这有帮助。
答案 1 :(得分:2)
在Java JSON解析器执行服务器作业之后,使用JsonpRequestBuilder很容易。 大多数错误都会导致服务器响应必须完成。
基本上你必须将javascript函数调用编码为响应。
在客户端上运行的代码
// invoke a JSON RPC call
//DO NOT FORGET TO CONFIGURE SERVLET ENDPOINT IN web.xml
new JsonpRequestBuilder().requestObject(
GWT.getModuleBaseURL() + "JsonRecordService?service=list"
,new AsyncCallback<JavaScriptObject>()
{
@Override
public void onFailure( Throwable caught )
{
Window.alert( caught.toString() );
}
@Override
public void onSuccess( JavaScriptObject result )
{ // you can use generics too send collections of objects
Window.alert( "JSON Data available." );
}
}
);
我在服务器端使用gjon类来完成序列化的脏工作。 现在是服务器端代码:
public class JsonRecordServiceImpl extends HttpServlet
{
@Override
public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException
{
try {
String serviceName = req.getParameter( "service" );
if ( serviceName == null )
{
//let request die by timeout, maybe we could inspect for a failure callback param
return;
}
//if this endpoint answer more then one service need map to a method name
//may wish use Reflection to map to a method name
if ( serviceName.equals( "list" ) ) //anwser to a list call
{
Gson g = new Gson();
// serialize it with GSONParser
//resp.setContentType( "text/javascript" );
//resp.setCharacterEncoding( "UTF-8" );
serviceName = req.getParameter( "callback" );
if ( serviceName != null ) resp.getWriter().write( serviceName + "(" );
resp.getWriter().write( g.toJson( Arrays.asList( "A", "B" ), new TypeToken<List<String>>(){}.getType() ) );
if ( serviceName != null ) resp.getWriter().write( ");" );
return;
}
}
catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}