Tôi nhận được NullPointerException
với rất ít chi tiết khi tôi cố gắng setServiceAccountUser(ACCOUNT_TO_IMPERSONATE)
trên GoogleCredential
của mình, tạo đối tượng dịch vụ Google Tasks và sau đó cố gửi yêu cầu danh sách Công việc từ ACCOUNT_TO_IMPERSONATE
.NullPointerException chỉ sau khi tôi đã setServiceAccountUser() cho đối tượng GoogleCredential (Grails/Java)
def credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_ID)
.setServiceAccountPrivateKeyFromP12File(P12_FILE)
.setServiceAccountScopes(GOOGLE_TASK_SCOPES)
.setServiceAccountUser(ACCOUNT_TO_IMPERSONATE)
.build()
credential.refreshToken()
log.debug("Google Credential Impersonating: ${credential.getServiceAccountUser()}")
def service = new com.google.api.services.tasks.Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build()
return service
Xin lưu ý rằng credential.getServiceAccountUser()
đăng xuất dự kiến ACCOUNT_TO_IMPERSONATE
.
Có một vấn đề tương tự được báo cáo trong https://github.com/googleads/googleads-java-lib/issues/19
StackTrace :
Caused by: java.lang.NullPointerException at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)
at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127)
at com.google.api.client.json.jackson2.JacksonFactory.createJsonParser(JacksonFactory.java:96)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:85)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:88)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.auth.oauth2.Credential.executeRefreshToken(Credential.java:570)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:247)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.api.ads.common.lib.auth.OAuth2Helper.callRefreshToken(OAuth2Helper.java:70)
at com.google.api.ads.common.lib.auth.OfflineCredentials.generateCredential(OfflineCredentials.java:144)
...
Việc thiếu chi tiết trong các lỗi được cho là một vấn đề trong các phiên bản cũ của Google Task nhưng tôi đã nâng cấp lên phiên bản mới nhất và thấy không có sự khác biệt .
compile "com.google.api-client:google-api-client:1.19.0"
compile 'com.google.apis:google-api-services-tasks:v1-rev41-1.19.0'
EDIT: Sau khi mày mò với mã kiểm tra vào grails console trong ứng dụng web của chúng tôi Tôi có thể thấy rằng thực hiện credential.refreshToken()
làm cho NPE khi ServiceAccountUser
được thiết lập.
Khi tôi bỏ đặt số ServiceAccountUser
, refreshToken()
thành công. Ngoài ra, việc cố gắng truy xuất danh sách Công việc của Google rất thành công đối với tài khoản Dịch vụ khi không đặt được ServiceAccountUser
.
Mọi trợ giúp sẽ được đánh giá cao.
Bạn đã xem điều này? http://stackoverflow.com/questions/12479551/google-drive-oauth-cant-figure-out-how-to-get-re-usable-googlecredentials – user1807337