如何在Coldfusion中使用google目录API的service acct

时间:2017-01-31 17:45:05

标签: java coldfusion google-admin-sdk google-directory-api

我一直在尝试使用Google的Directory API创建一个使用服务帐户的脚本,但没有运气。到目前为止,我有:

- 从here下载管理目录JAR文件并将它们全部放在我的WEB-INF / lib目录中

根据用于域委派的instructions处理服务帐户 - 我生成了一个P12文件而不是JSON,因为这是实例化代码使用的

-I将同一指令页面上的JAVA代码转换为ColdFusion,因此看起来像这样

p12File = createObject( 'java', 'java.io.File' ).init("{my file path}");
accountId = JavaCast( "string", "XXX@XXX.iam.gserviceaccount.com" );

GoogleCredential = createObject( "java", "com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder" );
HttpTransport = createObject( "java", "com.google.api.client.http.HttpTransport" );
NetHttpTransport = createObject( "java", "com.google.api.client.http.javanet.NetHttpTransport" );
JsonFactory = createObject( "java", "com.google.api.client.json.JsonFactory" );
JacksonFactory = createObject( "java", "com.google.api.client.json.jackson2.JacksonFactory" );
Directory = createObject( "java", "com.google.api.services.admin.directory.Directory$Builder" );
DirectoryScopes = createObject( "java", "com.google.api.services.admin.directory.DirectoryScopes" );
Collections = createObject( "java", "java.util.Collections" );

credential = GoogleCredential
.setTransport( NetHttpTransport )
.setJsonFactory( JacksonFactory )
.setServiceAccountId( accountId )
.setServiceAccountScopes( Collections.singleton( DirectoryScopes.ADMIN_DIRECTORY_USER ) )
.setServiceAccountUser("XXX@XXX.org")
.setServiceAccountPrivateKeyFromP12File( p12File )
.build();

service = Directory.Init( NetHttpTransport, JacksonFactory, javaCast( "null", "" ) ).setHttpRequestInitializer( credential ).build();

我的 service = Directory.Init ... 行读取了Coldfusion错误 “系统尝试使用未定义的值,这通常表示编程错误,无论是在您的代码还是某些系统代码中。空指针是未定义值的另一个名称。”,我不明白为什么。我能够弄清楚的是,这对于其中一个变量来说似乎是一个不可接受的值是一个相当普遍的错误。

TIA可以提供任何帮助

1 个答案:

答案 0 :(得分:1)

(来自评论......)

可能不相关,但.. NetHttpTransportJacksonFactory均未在CF代码中初始化。当您第一次在未初始化的java object上调用方法时,CF通常会自动调用no-arg构造函数:

  

如果在没有第一个的情况下在对象上调用公共非静态方法   调用init方法,ColdFusion对该方法进行隐式调用   默认构造函数。

但是,在将未初始化的对象传递到构造函数时,我不知道是否适用相同的规则。尝试显式调用对象上的init()以查看是否解决了NullPointerException:

NetHttpTransport = createObject( "java", "com.google.api.client.http.javanet.NetHttpTransport" ).init();
JacksonFactory = createObject( "java", "com.google.api.client.json.jackson2.JacksonFactory" ).init();