Google api: 将 credentialBuilder 转换为 httprequestInitializer

Google api: cast credentialBuilder to httprequestInitializer

我正在尝试访问 google 分析数据,但在我的 credentialBuilder 上不断收到 ClassCastException。这是我的代码:

(defn credential
  []
  (doto (GoogleCredential$Builder.)
    (.setTransport http-transport)
    (.setJsonFactory json-factory)
    (.setServiceAccountId "X")
    (.setServiceAccountPrivateKeyFromP12File (File. "X"))
    (.setServiceAccountScopes (AnalyticsReportingScopes/ANALYTICS_READONLY))
    (.build)))

(defn analytics
  []
  (doto (AnalyticsReporting$Builder. http-transport json-factory (credential))
    (.setApplicationName "X")
    (.build)))

我不断收到的确切错误是:

com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder cannot be cast to com.google.api.client.http.HttpRequestInitializer

我尝试按照Hello Analytics Reporting API V4: Java quickstart for service accounts示例,我做错了什么?

doto returns 作为第一个参数传递的对象 - 在您的情况下它将 return GoogleCredential$Builder 的实例并忽略 [=15= 的结果] 调用。您需要将其更改为 return 调用 (.build) 的结果:

(defn credential
  []
  (->
    (doto (GoogleCredential$Builder.)
      (.setTransport http-transport)
      (.setJsonFactory json-factory)
      (.setServiceAccountId "X")
      (.setServiceAccountPrivateKeyFromP12File (File. "X"))
      (.setServiceAccountScopes (AnalyticsReportingScopes/ANALYTICS_READONLY)))
    (.build))

doto 宏扩展为如下形式:

(doto (StringBuilder.)
  (.append "a")
  (.append "b"))

变成

(let [obj (StringBuilder.)]
  (.append obj "a")
  (.append obj "b")
  obj)