Google Drive API(Driver.Builder)身份验证问题:NullPointerException前置条件检查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google Drive API(Driver.Builder)身份验证问题:NullPointerException前置条件检查相关的知识,希望对你有一定的参考价值。

我试图通过驱动器API和谷歌提供的服务协议访问我的谷歌驱动器,但我似乎无法获得驱动器生成器对象。

当我尝试构建经过身份验证的驱动器服务对象时,我得到一个非描述性的空指针。我在制作服务帐户时是否遗漏了某个身份验证步骤?我知道我正在获得正确的访问权限,因为我对HTTP请求和google OAuth游戏机做了一个解决方法,但驱动程序构建器不会构建。

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)
", 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字段永远不会被初始化的编译器警告。

另一答案

通过使用显然不为null的NetHttpTransport修复此问题。

Drive.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), null) .setHttpRequestInitializer(credential).setApplicationName(applicationName).build();

以上是关于Google Drive API(Driver.Builder)身份验证问题:NullPointerException前置条件检查的主要内容,如果未能解决你的问题,请参考以下文章

通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格

Google Drive API无法找到任何文件夹

使用 Java 和 Google Drive API V3 将文件上传到共享的 Google Drive 位置?

html #API #Google Drive - 创建保存按钮

Google Drive api范围和文件访问(驱动器vs drive.files)

未经PHP身份验证,Google Drive API不允许上传文件