2012-11-05 2 views
0
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); 
     }); 
    }); 
}-*/; 

Я получаю эту ошибку:GWT: «непризнанный формат вызова»: что это значит?

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 при поиске для него?

Я подозреваю, что я неправильно вызываю функцию JSNI в строке 3. Но я AFAIK, следуя всем правилам, указанным в документах here.

EDIT:

Это работает:

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); 
     }); 
    }); 
}-*/; 
+0

Является ли ваш метод 'result' статическим? Получает ли он только одну строку в качестве аргумента? Если это так, возможно, проблема '' + '"' + JSON.stringify (result.rows) .replace ('"', '\\ "') + '"' + "'. –

+0

@GilbertoTorrezan: Насколько я вижу, ошибка вызывается непосредственно перед вызовом функции. результат объявляется так: 'static void result (String json)' –

ответ

1

Вы можете не eval JSNI вызовы в Java - этот код не является реальным JavaScript , но является частью взаимодействия JS и Java в GWT. Как это работает, так это то, что эти вызовы переписываются так, что они называют настоящую функцию JavaScript.

+0

Я получаю ту же ошибку без eval, хотя –

+0

Что у вас есть без eval? просто оператор журнала? И что такое обернутая (т. Е. Внутри UmbrellaException) ошибка? Вы также, по-видимому, вызываете метод 'query', как если бы он был статичным (без' instance.' перед ним), но он не является статическим. И это, и eval действительно не имеют смысла и должны быть уточнены в вопросе. Еще один, прежде чем добавить комментарий - вы перечисляете только один из двух аргументов в методе 'query' sig в ​​JSNI - где QueryResult? –

+0

«без eval» Я имел в виду, что я просто заменил его обычным вызовом функции JSNI. Полная трассировка стека здесь: https://gist.github.com/4021567. Eval - из более ранней итерации, где я хотел сделать ее более динамичной, но теперь это не имеет значения, мне просто нужно сначала позвонить. –