Я пытался адаптировать краткое руководство по Java для взаимодействия с API-интерфейсом Google Drive для проекта Scala Play, однако у меня возникли проблемы с чтением файла учетных данных, он говорит, что его нет, однако я пытался:
Но ни один из них не сработал.
вот моя структура проекта: Структура проекта
Вот ошибка: Ошибка
И вот код, который я использую, чтобы попытаться прочитать файл:
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver
import com.google.api.client.googleapis.auth.oauth2.{GoogleAuthorizationCodeFlow, GoogleClientSecrets}
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.client.util.store.FileDataStoreFactory
import com.google.api.services.sheets.v4.SheetsScopes
import java.io.{File, FileNotFoundException, IOException, InputStreamReader}
import java.security.GeneralSecurityException
import java.util
import java.util.Collections
class GoogleService {
private val applicationName: String = "Google Sheets API Java Quickstart"
private val jsonFactory: JsonFactory = JacksonFactory.getDefaultInstance()
private val tokenDirectoryPath: String = "tokens"
private val scopes: util.List[String] = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY)
private val credentialsFilePath: String = "app/assets/credentials.json"
@throws[IOException]
private def getCredentials(HTTP_TRANSPORT: NetHttpTransport) = { // Load client secrets.
val in = classOf[GoogleService].getResourceAsStream(credentialsFilePath)
if (in == null) {
System.out.printf(credentialsFilePath)
throw new FileNotFoundException(s"Resource not found: $credentialsFilePath")
}
val clientSecrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(in))
// Build flow and trigger user authorization request.
val flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, jsonFactory, clientSecrets, scopes).setDataStoreFactory(new FileDataStoreFactory(new File(tokenDirectoryPath))).setAccessType("offline").build
val receiver = new LocalServerReceiver.Builder().setPort(8888).build
new AuthorizationCodeInstalledApp(flow, receiver).authorize("user")
}
@throws[IOException]
@throws[GeneralSecurityException]
def main(args: String*
) {
val httpTransport = GoogleNetHttpTransport.newTrustedTransport
getCredentials(httpTransport)
}
}
Тест должен быть GoogleService (теперь изменено), а версия scala - 2.13.3.
Попробуйте заменить:
val in = classOf[GoogleService].getResourceAsStream(credentialsFilePath)
с:
val in = getClass.getResourceAsStream(credentialsFilePath)
Обратите внимание, что ресурсы обычно находятся в папке conf
, и именно там их ищут. Пожалуйста, попробуйте переместить папку assets
из папки app
в папку conf
. Затем обновите:
private val credentialsFilePath: String = "assets/credentials.json"
Решено, спасибо, решил, что странно, но абсолютный путь не работал.
Какую версию Scala вы используете? Что такое
test
вclassOf[test]
?