GWT:我如何使用JsonpRequestBuilder来处理列表的Json响应

时间:2010-03-15 04:16:36

标签: json gwt

我的后端服务器函数返回一个json对象列表 呼叫者,召集者。

我想使用JsonRequestBuilder与此后端函数进行交互

我以这种方式定义了AsyncCallback

class MyCallBack extends AsyncCallback<List<MyObject>> {
但是,JsonpRequestBuilder没有这个声明AsyncCallback因为泛型 类型以<T extends JavaScriptObject&gt;为界。列表<MyObject&GT;不满足这个要求。

你对这个问题有什么建议吗?

2 个答案:

答案 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();
    } 
  }
}