2016-10-20 4 views
1

Я пытаюсь получить доступ к данным Google Analytics, но продолжаю получать ClassCastException на моем credentialBuilder. Вот мой код:Google api: cast credentialBuilder to httprequestInitializer

(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 не может быть приведен к com.google .api.client.http.HttpRequestInitializer

Я стараюсь следовать Hello Analytics Reporting API V4: Java quickstart for service accounts примеру, что я делаю неправильно?

ответ

2

doto возвращает объект, переданный в качестве первого аргумента, - в вашем случае он вернет экземпляр GoogleCredential$Builder и проигнорирует результат вызова (.build). Вы должны изменить его, чтобы вернуть результат вызова к (.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) 
+0

Спасибо ! Теперь я понимаю, почему я получаю ошибку и как ее исправить :) –