My backend s开发者_运维技巧erver function returns a list of json object to the caller.
I would like to use JsonRequestBuilder to interact with this backend function
I defined a AsyncCallback this way
class MyCallBack extends AsyncCallback<List<MyObject>> {
However, JsonpRequestBuilder does not this declaration AsyncCallback because the generic
type is bounded to <T extends JavaScriptObject
>. List<MyObject
> does not satisfy this requirement.
Do you have any suggestion to this problem?
See this example from the docs for JsonpRequestBuilder
class Feed extends JavaScriptObject {
protected Feed() {}
public final native JsArray<Entry> getEntries() /*-{
return this.feed.entry;
}-*/;
}
Instead of the response being a straight List
, the response is a JavaScriptObject that contains a JS array, which is exposed via the JSNI getEntries()
method.
If the JSON response doesn't name the array (like var feed = [...]
) then I believe you can just do return this
but you'd have to try it to be sure. Hope this helped.
Using JsonpRequestBuilder is easy after you a Java JSON parser to do the server job. Most mistakes come to the way that server response must de done.
Basically you have to code a javascript function call as response.
Code to run on client
// 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." );
}
}
);
I used the gjon class on server side todo the dirty job of serialization. Now the server side code:
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();
}
}
}
精彩评论