在Java的Google drive中使用Google电子表格API创建电子表格
我已经创建了一些工具来填充谷歌电子表格。 从今天起,我就开始犯错误了,一年来它一直运转良好在Java的Google drive中使用Google电子表格API创建电子表格,java,google-api,google-sheets,gmail-api,Java,Google Api,Google Sheets,Gmail Api,我已经创建了一些工具来填充谷歌电子表格。 从今天起,我就开始犯错误了,一年来它一直运转良好 Exception in thread "main" com.google.gdata.util.AuthenticationException: Error authenticating (check service name) at com.google.gdata.client.GoogleAuthTokenFactory.getAuthException(GoogleAuthTokenFactor
Exception in thread "main" com.google.gdata.util.AuthenticationException: Error authenticating (check service name)
at com.google.gdata.client.GoogleAuthTokenFactory.getAuthException(GoogleAuthTokenFactory.java:688)
at com.google.gdata.client.GoogleAuthTokenFactory.getAuthToken(GoogleAuthTokenFactory.java:560)
at com.google.gdata.client.GoogleAuthTokenFactory.setUserCredentials(GoogleAuthTokenFactory.java:397)
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:364)
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:319)
at com.google.gdata.client.GoogleService.setUserCredentials(GoogleService.java:303)
这是连接gmail的部分代码:
String USERNAME = "usename@........com"; ->of course I'm using proper username and password
String PASSWORD = "*******";
SpreadsheetService service
= new SpreadsheetService("SandboxCheck");
service.setUserCredentials(USERNAME, PASSWORD);
我不知道如何与gmail连接,我试图通过oAuth实现这一点,但我不知道如何实现。在上的示例中,只有.net的代码。谷歌刚刚停止支持OAuth1.0。需要使用OAuth2。要切换,首先转到Google开发者控制台,创建一个项目并设置一个凭证。然后更新代码,类似于以下Java代码:
private void createSpreadSheetService() throws GeneralSecurityException, IOException, ServiceException {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
String [] SCOPESArray= {"https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds"};
final List SCOPES = Arrays.asList(SCOPESArray);
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(SCOPES)
.setServiceAccountPrivateKeyFromP12File(SERVICE_ACCOUNT_PKCS12_FILE)
.build();
SPREADSHEETSERVICE = new SpreadsheetService("data");
SPREADSHEETSERVICE.setOAuth2Credentials(credential);
}
您需要两个库:GoogleAPI客户端和GoogleHTTP客户端。如果使用Maven,请在pom.xml中包含以下依赖项
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.19.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson</artifactId>
<version>1.19.0</version>
<type>jar</type>
</dependency>
com.google.api-client
谷歌api客户端
1.19.0
罐子
com.google.http-client
谷歌http客户端jackson
1.19.0
罐子
我尝试过Gao的解决方案,但我有一个关于库的问题。我正在使用netbeans,项目正在构建中,没有错误,但当我尝试执行它时,我遇到了以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory
at com.google.api.client.json.jackson.JacksonFactory.<init>(JacksonFactory.java:38)
at SandboxCheck.main(SandboxCheck.java:48)
线程“main”java.lang.NoClassDefFoundError中的异常:org/codehaus/jackson/JsonFactory
位于com.google.api.client.json.jackson.JacksonFactory.(JacksonFactory.java:38)
位于SandboxCheck.main(SandboxCheck.java:48)
我发现类路径有问题,但我不知道如何在netbeans上修复它,我认为它会在添加库时自动修复。
我补充说
google-oauth-client-1.16.0-rc.jar google-oauth-client-1.16.0-rc-sources.jar google-api-client-1.8.0-beta-sources.jar google-api-client-1.4.1-beta.jar google-api-client-1.19.1.jar
我不确定我是否添加了太多的库,但是如果我删除例如google-api-client-1.4.1-beta.jar,它将不会看到JacksonFactory类。我终于在帮助下创建了这样的连接。
一切都像以前一样正常。
您必须执行的步骤是:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.util.ServiceException;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;
public class OAuthIntegration{
public static void main(String[] args) throws MalformedURLException, GeneralSecurityException, IOException, ServiceException {
URL SPREADSHEET_FEED_URL;
SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
File p12 = new File("./key.p12");
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
String[] SCOPESArray = {"https://spreadsheets.google.com/feeds", "https://spreadsheets.google.com/feeds/spreadsheets/private/full", "https://docs.google.com/feeds"};
final List SCOPES = Arrays.asList(SCOPESArray);
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId("cliend_ID")
.setServiceAccountScopes(SCOPES)
.setServiceAccountPrivateKeyFromP12File(p12)
.build();
SpreadsheetService service = new SpreadsheetService("Test");
service.setOAuth2Credentials(credential);
SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
if (spreadsheets.size() == 0) {
System.out.println("No spreadsheets found.");
}
SpreadsheetEntry spreadsheet = null;
for (int i = 0; i < spreadsheets.size(); i++) {
if (spreadsheets.get(i).getTitle().getPlainText().startsWith("ListOfSandboxes")) {
spreadsheet = spreadsheets.get(i);
System.out.println("Name of editing spreadsheet: " + spreadsheets.get(i).getTitle().getPlainText());
System.out.println("ID of SpreadSheet: " + i);
}
}
}
}
我怀疑你碰到了两个问题。1) OpenAuth 1/客户端登录不再受支持,2)文档列表API已被降级,因此您需要迁移到驱动器API以创建电子表格。不幸的是,我没有关于如何在Java中实现这一点的示例,看起来客户端登录不再受支持。我希望他们会更新SpreedAPI页面,并给出如何在Java中使用它的示例。从昨天开始,这里也有同样的问题!他们是否已放弃对应用程序密码身份验证的支持?原因是:不再支持OpenAuth 1/客户端登录。正如本文所述,您从何处导入
JacksonFactory
?运行此CreateSpeedsheetService
需要哪些库?Gao您能告诉我您使用了哪些库来实现此代码吗?我一直面临异常和其他错误。这里也有完全相同的问题。更新:通过import com.fasterxml.jackson.core.*设法解决它代码>。我不知道我到底在做什么,也不知道发生了什么。Dimitris是如何通过此导入使其工作的,因为它使用的是JsonFactory而不是JacksonFactory,我仍然存在此问题。JsonFactory
是一个抽象超类,您的问题在于JacksonFactory
无法找到定义。将jackson-core-2.1.3.jar
包含到项目的库中,并导入我编写的内容。我在线程“main”java.lang.AbstractMethodError中遇到了异常:com.google.api.client.json.JsonFactory.createJsonGenerator(Ljava/io/OutputStream;Ljava/nio/charset/charset;)Lcom/google/api/client/json/JsonGenerator
onSpreadsheetFeed=service.getFeed(电子表格\u feed\u URL,SpreadsheetFeed.class)代码>谢谢Skwarsz。给其他人一个小小的澄清。在步骤4中,控制台将为您提供“客户ID”和“电子邮件地址”。(a) 您需要在setServiceAccountId()方法调用中使用“电子邮件地址”(而不是ID,不管方法名称如何)。(b) 您需要使用相同的电子邮件地址共享电子表格。电子表格文档代码中定义的范围变量应为:静态最终列表范围\u数组=数组。asList(“https://spreadsheets.google.com/feeds", "https://spreadsheets.google.com/feeds/spreadsheets/private/full", "https://docs.google.com/feeds")
谢谢Skwarsz。不过有一个小问题:我认为您需要gdata-core-1.47.1.jar,而不是您正在使用的gdata-core-1.0.jar。版本1.0不识别SpreadsheetService类的setOAuth2Credentials()方法。@Skvarosz:我实际上发现gdata-spreadsheet.jar和gdata-core.jara重叠。对我来说,删除gdata-spreadsheet.jar是有效的。考虑检查项目中是否存在冗余,在哪里保存P12密钥文件?
guava-11.0.2.jar
gdata-spreadsheet-3.0.jar
gdata-maps-2.0.jar
gdata-core-1.0.jar
jackson-core-asl-1.9.11.jar
jackson-core-2.1.3.jar
google-oauth-client-1.20.0.jar
google-http-client-jackson2-1.20.0.jar
google-http-client-jackson-1.20.0.jar
google-http-client-1.20.0.jar
google-api-client-1.20.0.jar