GWT: Как я могу использовать JsonpRequestBuilder для обработки ответа Json на список - PullRequest
1 голос
/ 15 марта 2010

Моя серверная функция возвращает список объектов json в звонящий.

Я бы хотел использовать JsonRequestBuilder для взаимодействия с этой серверной функцией

Я определил AsyncCallback таким образом

class MyCallBack extends AsyncCallback<List<MyObject>> {

Однако JsonpRequestBuilder не делает это объявление AsyncCallback, потому что универсальный тип ограничен <T extends JavaScriptObject>. Список <MyObject> не удовлетворяет этому требованию.

Есть ли у вас какие-либо предложения по этой проблеме?

Ответы [ 2 ]

5 голосов
/ 15 марта 2010

См. Этот пример из документов для JsonpRequestBuilder

class Feed extends JavaScriptObject {
  protected Feed() {}

  public final native JsArray<Entry> getEntries() /*-{
    return this.feed.entry;
  }-*/;
}

Вместо того, чтобы быть прямым List, ответом является JavaScriptObject, содержащий массив JS, который предоставляется с помощью метода JSNI getEntries().

Если в ответе JSON массив не указан (например, var feed = [...]), то я считаю, что вы можете просто набрать return this, но для этого вам нужно попробовать. Надеюсь, это помогло.

2 голосов
/ 25 июля 2012

Использование JsonpRequestBuilder легко после того, как вы выполните анализатор Java JSON для выполнения работы сервера. Большинство ошибок приводит к тому, что ответ сервера должен быть сделан.

Как правило, вы должны кодировать вызов функции 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();
    } 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...