1

这很令人沮丧,我在这里被困了一个星期,不知道如何解决它;(

受到 Gerwin Sturm 的出色工作 ( https://github.com/Scarygami/gdg-endpoint-demo ) 的启发,我更喜欢构建 java 后端。

但不幸的是,每次我尝试调用端点 API 时,都会出现 NoSuchMethodError 错误。

Exception: NoSuchMethodError : method not found: '_client@0x296594a'
Receiver: Instance of 'Dbentryendpoint'
Arguments: []
Stack Trace: #0      Object.noSuchMethod (dart:core-patch:1737:25)
#1      Dbentryendpoint.listDBEntry (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/packages/google_dbentryendpoint_v1_api/src/browser/dbentryendpoint.dart:162:16)
#2      main.fetch (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:24:20)
#3      main (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:64:8)

Exception: NoSuchMethodError : method not found: '_client@0x296594a'
Receiver: Instance of 'Dbentryendpoint'
Arguments: []
Stack Trace: #0      Object.noSuchMethod (dart:core-patch:1737:25)
#1      Dbentryendpoint.insertDBEntry (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/packages/google_dbentryendpoint_v1_api/src/browser/dbentryendpoint.dart:124:16)
#2      main.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (http://127.0.0.1:3030/C:/Users/VincentZhou/dart/dart_dbentryendpoint_v1_api_client/demo.dart:56:28)

demo.dart 的源代码几乎与原始源代码 ( https://github.com/Scarygami/gdg-endpoint-demo ) 相同,我只更改了 cloudendpint API 和 Web 客户端 ID。

import "dart:html";
import 'packages/google_dbentryendpoint_v1_api/dbentryendpoint_v1_api_browser.dart' as gdglib;
import 'packages/google_plus_v1_api/plus_v1_api_browser.dart' as pluslib;
import 'packages/google_oauth2_client/google_oauth2_browser.dart';

final CLIENT_ID = "878766780041.apps.googleusercontent.com";
final SCOPES = ["https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/plus.me"];

void main() {
  var auth = new GoogleOAuth2(CLIENT_ID, SCOPES);
  var gdg = new gdglib.Dbentryendpoint(auth);
  var plus = new pluslib.Plus(auth);
  var container = query("#entries");
  var loginButton = query("#login");
  var sendButton = query("#send");
  InputElement textInput = query("#text");
  var authorSpan = query("#author");
  pluslib.Person me;


  void fetch() {
    //gdg.makeAuthRequests = false;
    gdg.makeAuthRequests = true;
    gdg.listDBEntry(limit:10).then((l) {
      container.text = "";
      if (l.items != null) {
        l.items.forEach((e) {
          var p = new ParagraphElement();
          var date = e.date.replaceAll("T", " ");
          p.text = "$date - ${e.author}: ${e.text}";
          container.append(p);
        });
      }
    });
  }

  loginButton.onClick.listen((Event e) {
    auth.login().then((token) {
      loginButton.style.display = "none";
      plus.makeAuthRequests = true;
      plus.people.get("me").then((p) {
        me = p;
        authorSpan.text = "${me.displayName}:";
        authorSpan.style.display = "inline-block";
        textInput.style.display = "inline-block";
        sendButton.style.display = "inline-block";

        sendButton.onClick.listen((Event e) {
          var text = textInput.value;
          textInput.value = "";
          var entry = new gdglib.DBEntry.fromJson({
            "author": me.displayName,
            "text": text
          });
          gdg.makeAuthRequests = true;
          gdg.insertDBEntry(entry).then((entry) {
            fetch();
          });
        });
      });
    });
  });

在 Google App Engine 方面,我由 GPE 自动生成云端点类,然后添加客户端 ID 相关信息:

@Api(name = "dbentryendpoint",
        clientIds={Ids.WEB_CLIENT_ID,com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
        scopes={"https://www.googleapis.com/auth/userinfo.email"}
)
public class DBEntryEndpoint {
.....

感谢任何帮助!

4

2 回答 2

0

包导入看起来不正确,试试这个。

import 'packages:google_dbentryendpoint_v1_api/dbentryendpoint_v1_api_browser.dart' as gdglib;
import 'packages:google_plus_v1_api/plus_v1_api_browser.dart' as pluslib;
import 'packages:google_oauth2_client/google_oauth2_browser.dart';
于 2013-03-05T17:06:26.863 回答
0

I think I figure out the way to work around it but I don't know why:

  1. the "generate cloud endpoints" of GPE doesn't generate the path, for example it generate the method listEntities, not entities.list
  2. the path is necessary to generate resource in _ah/api/discovery/v1/apis/dbentryendpoint/v1/rest; without path ,there is only schemas and methods, not schemas and resources
  3. without resources, the Dart client generator only export empty resouces.dart under /commom folder. and the mothods will be inside entityEndpoints.dart, which cannot correctly recognize the _client(), which is defined in client.dart under /common.

So the demo.dart cannot find the method.

Question: why the path is ncessary? because GPE dont generate the path automatically, can we have a way to generate the correct dart client file without manually adding the path in google app engine file? Thanks.

于 2013-03-05T21:33:45.330 回答