java - Google Drive API (Driver.Builder) 身份验证问题 : NullPointerException Precondition check

标签 java google-drive-api google-oauth

我正在尝试通过驱动器 API 和 google 提供的服务到服务协议(protocol)访问我的 google 驱动器,但我似乎无法获取驱动器构建器对象。

当我尝试构建经过身份验证的驱动器服务对象时,我得到一个无描述的空指针。当我创建服务帐户时,我是否在某个地方缺少身份验证步骤?我知道我获得了正确的访问 token ,因为我使用 HTTP 请求和 google OAuth Playground 进行了解决方法,但驱动器构建器无法构建。

public class GoogleDriveService {

/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY =
  JacksonFactory.getDefaultInstance();

/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;

/** Client Email */
private static final String SERVICE_ACCOUNT_EMAIL =
  "gdrive-p12@generator-dev.iam.gserviceaccount.com";

/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "/gdrive-p12.p12";

/**
 * Build and return an authorized Drive client service.
 * @return an authorized Drive client service
 * @throws IOException
 */
public static Drive getDriveService() throws IOException, GeneralSecurityException {

  GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
    .setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
    .setServiceAccountScopes(Collections.singleton(DriveScopes.DRIVE))
    .build();

  System.out.println(credential);

  return new Drive.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, credential)
    .build();
}

public static void main(String[] args) throws IOException, GeneralSecurityException {
  // Build a new authorized API client service.
  Drive service = getDriveService();

  // Print the names and IDs for up to 10 files.
  FileList result = service.files().list()
    .setPageSize(10)
    .setFields("nextPageToken, files(id, name)")
    .execute();
  List<File> files = result.getFiles();
  if (files == null || files.size() == 0) {
    System.out.println("No files found.");
  } else {
    System.out.println("Files:");
    for (File file : files) {
      System.out.printf("%s (%s)\n", file.getName(), file.getId());
    }
  }
}

结果:

Exception in thread "main" java.lang.NullPointerException
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:213)
    at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127)
    at com.google.api.client.googleapis.services.AbstractGoogleClient$Builder.<init>(AbstractGoogleClient.java:333)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient$Builder.<init>(AbstractGoogleJsonClient.java:74)
    at com.google.api.services.drive.Drive$Builder.<init>(Drive.java:7783)
    at com.lumos.xlsx_manager.es.da.services.GoogleDriveService.getDriveService(GoogleDriveService.java:59)
    at com.lumos.xlsx_manager.es.da.services.GoogleDriveService.main(GoogleDriveService.java:66)

最佳答案

我认为错误可能在这里:

/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;

您没有将 HTTP_TRANSPORT 设置为任何内容,因此它保留为 null。我猜想这就是 Google Drive API 所提示的。

JSON_FACTORYSERVICE_ACCOUNT_EMAIL 不同,您也没有声明它final。如果您这样做了,您可能会收到有关 final 字段从未初始化的编译器警告。

关于java - Google Drive API (Driver.Builder) 身份验证问题 : NullPointerException Precondition check,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48053937/

相关文章:

java - 工作完成后我应该停止线程吗?

java - 在 Spring boot 测试中,如何创建一个 bean 并通过 @Autowired 注入(inject)?

c# - 从 Google 中的客户端电子邮件和私钥(服务帐户)获取 token

google-apps-script - 如果我的代码没有对 Google+ 的可见引用,Google+ OAuth 关闭是否会影响我?

google-oauth - 生成新的客户端密码

java - 抽象方法与继承

java - 从三角形的顶点访问区域

google-apps-script - Drive.Files.remove(fileId) 删除项目但返回错误消息

android - 谷歌驱动器图标文件。无法编译 Eclipse Android 项目

java - 如何授予 Google Drive REST API 的完全权限?