GWT:“无法识别的呼叫格式”:这是什么意思?

时间:2012-11-05 23:42:45

标签: gwt interop

public void query(String sql, QueryResult queryResult) {
    q = queryResult;
    realQuery(sql, conString);
}

public static native void realQuery(String sql, String conString) /*-{
    $wnd.pg.connect(conString, function(err, client) {
        client.query(sql, function(err, result) {
            console.log(result.rows);
            var code = "@db.tud.bp.werkstatt.client.PgClient::result(Ljava/lang/String;)(" + '"' + JSON.stringify(result.rows).replace('"','\\"') + '"' + ");";
            console.log(code);
            eval(code);
        });
    });
}-*/;

我收到此错误:

com.google.gwt.event.shared.UmbrellaException: Exception caught: (Error) 
@de.tud.bp.werkstatt.client.PgClient::realQuery(Ljava/lang/String;Ljava/lang/String;)
([string: 'SELECT age FROM person WHERE name='Ayeb'', string: '/rest/query']): 
  unrecognized calling format
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:129)

“无法识别的通话格式”是什么意思,为什么我在搜索时没有获得任何Google搜索结果?

我怀疑我在第3行以错误的方式调用JSNI函数。但是我遵循文档here中指定的所有规则我是AFAIK。

修改

这有效:

public static native void realQuery(JavaScriptObject parsed) /*-{
    var sql = parsed[0];
    var conString = parsed[1];
    $wnd.pg.connect(conString, function(err, client) {
    });
}-*/;

这不是:

public static native void realQuery(JavaScriptObject parsed) /*-{
    var sql = parsed[0];
    var conString = parsed[1];
    $wnd.pg.connect(conString, function(err, client) {
        client.query(sql, function(err, result) {
            console.log(result.rows);
        });
    });
}-*/;

1 个答案:

答案 0 :(得分:1)

您不能eval JSNI调用Java - 该代码不是真正的JavaScript,而是JS和Java在GWT中交互的一部分。最终工作的方式是重写这些调用,以便它们调用真正的JavaScript函数。