【问题标题】:Google DrEdit example for Java won't workJava 的 Google DrEdit 示例不起作用
【发布时间】:2013-10-02 19:57:33
【问题描述】:

我按照步骤为 Java 部署 DrEdit:

https://github.com/googledrive/dredit/tree/master/java

当我访问应用程序时,我在 AppEngine 日志控制台中收到此错误!

2013-10-02 12:51:08.404
/start
java.lang.NullPointerException
    at com.google.drive.samples.dredit.DrEditServlet.loginIfRequired(DrEditServlet.java:149)
    at com.google.drive.samples.dredit.StartPageServlet.doGet(StartPageServlet.java:46)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)

这是第 149 行。credentialManager 为空。

protected void loginIfRequired(HttpServletRequest req,
    HttpServletResponse resp) {
  Credential credential = getCredential(req, resp);
  if (credential == null) {
    // redirect to authorization url
    try {
      resp.sendRedirect(credentialManager.getAuthorizationUrl());  // line 149

应该在init()中设置

  public void init() throws ServletException {
    super.init();
    // init credential manager
    credentialManager = new CredentialManager(
        getClientSecrets(), TRANSPORT, JSON_FACTORY);
  }

我无法使用 System.out.println,因为它永远不会显示在日志中,即使我选择了“所有请求”。

我也遇到了 NoSuchMethodError:

Error for /
java.lang.NoSuchMethodError: com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(Lcom/google/api/client/json/JsonFactory;Ljava/io/InputStream;)Lcom/google/api/client/googleapis/auth/oauth2/GoogleClientSecrets;
    at com.google.drive.samples.dredit.DrEditServlet.getClientSecrets(DrEditServlet.java:249)
    at com.google.drive.samples.dredit.DrEditServlet.init(DrEditServlet.java:88)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)

这恰好是一行:

249       return GoogleClientSecrets.load(JSON_FACTORY, stream);

我应该提到,当我访问 localhost:8888/start 时,它在本地工作正常,因为它只是将我发送到 Google 进行身份验证,但当它尝试重定向到 appspot.com/oauth2callback 时当然会失败。

【问题讨论】:

    标签: java google-app-engine google-drive-api


    【解决方案1】:

    “NoSuchMethodError”可能是您复制/粘贴的代码与您安装的 Google Oauth 库版本不匹配。我的猜测是该库已更新,但 Google 没有返回并更新 DrEdit 示例。如果您使用带有 Google 插件的 Eclipse,它将为您获取最新的库。

    最后一点,要在本地服务器上测试 oauth,有几个技巧。

    选项 1。 在您的本地 /etc/hosts 文件(或等效文件)127.0.0.1 dev.example.com 中创建一个条目。然后,您可以在 API 控制台中将 dev.example.com 配置为回调 URL。

    选项 2. 使用 goo.gl 为 localhost:8000/mycallbackservlet 创建缩短的 URL 然后您可以在 API 控制台中将缩短的 URL 配置为回调 URL。 (注意,我使用选项 1,所以没有亲自尝试过)。

    在这两种情况下,您都需要修改代码以感知它在本地开发服务器上运行并相应地调整其回调 URL。

    关于您的 NPE 问题,如果没有进一步的信息,显然很难说,但我的 2c is DrEdit 不是理解 oauth 的好切入点。

    【讨论】:

      【解决方案2】:

      目前,我也在处理 DrEdit 代码,并且我已经通过错误,因为没有这样的方法用于行 - 返回 GoogleClientSecrets.load(JSON_FACTORY, 流);

      我更正了代码,在该语句之前添加了一行 -

      InputStream stream = getServletContext().getResourceAsStream(CLIENT_SECRETS_FILE_PATH);
      InputStreamReader reader = new InputStreamReader(stream); //I have added this line.
      try {
            return GoogleClientSecrets.load(JSON_FACTORY, reader); //initially it was stream. I changed it to reader. 
      

      这解决了我没有这种方法的问题。我不确定你得到的 NPE。希望这个小修正也能解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2012-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多