2017-11-15 20 views
0

GoogleスプレッドシートとGoogleドライブAPIの読み書きにGoogle APIを使用しています。 私は最近、予定表招待状を送る必要があるプロジェクトを割り当てられました。ウェブサイトはApache Tomcat 8.5でホストされているJSFページです。他のAPIについては、サービスアカウントを使用しています。 カレンダーサービスを同じ方法で承認しようとしましたが、失敗しました。最初の行は、そのカレンダーサービスに障害が発生し、シートのサービスのために成功しAUTHORIZEです:OAuth 2.0はGoogleスプレッドシートでは動作しますが、GoogleカレンダーAPIでは使用できません

GoogleConnection: Absolut Path: H:/ownCloud/Wabco/Workspace/WabcoDiagram/WebContent/resources/webserviceaccount.json GoogleConnection: Absolut Path: H:/ownCloud/Wabco/Workspace/WabcoDiagram/WebContent/resources/webserviceaccount.json Exception in thread "main" java.lang.NoSuchMethodError: com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient$Builder.setBatchPath(Ljava/lang/String;)Lcom/google/api/client/googleapis/services/AbstractGoogleClient$Builder; at com.google.api.services.calendar.Calendar$Builder.setBatchPath(Calendar.java:6758) at com.google.api.services.calendar.Calendar$Builder.(Calendar.java:6737) at de.promolitor.wabcodiagramviewer.audit.AuditGoogleCalendar.getCalendarServiceLocal(AuditGoogleCalendar.java:112) at de.promolitor.wabcodiagramviewer.audit.AuditGoogleCalendar.initializeCalendarServiceLocal(AuditGoogleCalendar.java:150) at de.promolitor.wabcodiagramviewer.audit.AuditGoogleCalendar.main(AuditGoogleCalendar.java:156)

私の質問: 私はGoogleカレンダーのAPIにサービスアカウントでログインすることができ、または私が持っている変化は何ですかそれとも、どこかで私のコードに別のエラーがありますか?

Webサービスサービスアカウントから予定表招待状を送信し、別のユーザーに予定の管理者または作成者を作成させることで、必要に応じてイベントを変更できますか?これには「ドメイン全体の権限」が必要ですか? 私はGSuitを使用する会社のために働いています。

例コード。ローカル関数はローカルテスト用です。

package de.promolitor.wabcodiagramviewer.audit; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.faces.context.FacesContext; 
import javax.servlet.ServletContext; 

import com.google.api.client.auth.oauth2.Credential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.client.util.DateTime; 
import com.google.api.services.calendar.Calendar; 
import com.google.api.services.calendar.CalendarScopes; 
import com.google.api.services.calendar.model.Event; 
import com.google.api.services.calendar.model.Events; 
import com.google.api.services.drive.Drive; 
import com.google.api.services.drive.DriveScopes; 
import com.google.api.services.gmail.GmailScopes; 
import com.google.api.services.plus.Plus; 
import com.google.api.services.sheets.v4.Sheets; 
import com.google.api.services.sheets.v4.SheetsScopes; 

public class AuditGoogleCalendar { 
    /** Application name. */ 
    private static final String APPLICATION_NAME = "Wabco Audit"; 

    /** Global instance of the {@link FileDataStoreFactory}. */ 
    // private static FileDataStoreFactory DATA_STORE_FACTORY; 

    /** Global instance of the JSON factory. */ 
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 

    private static GoogleCredential credential; 

    /** Global instance of the HTTP transport. */ 
    private static HttpTransport httpTransport; 

    private static Plus plus; 

    private static Sheets service; 
    private static Drive driveService; 
    private static Calendar calendarService; 

    /** 
    * Global instance of the scopes required by this quickstart. 
    * 
    * If modifying these scopes, delete your previously saved credentials at 
    * ~/.credentials/sheets.googleapis.com-java-quickstart 
    */ 
    private static final List<String> SCOPES = Arrays.asList(SheetsScopes.SPREADSHEETS, DriveScopes.DRIVE, 
      GmailScopes.MAIL_GOOGLE_COM, CalendarScopes.CALENDAR); 

    static { 
     try { 
      httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
      System.exit(1); 
     } 
    } 


    public static GoogleCredential authorize() throws IOException, GeneralSecurityException { 
     String relativeWebPath = "/resources/" + "webserviceaccount.json"; 
     ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext() 
       .getContext(); 
     String absoluteDiskPath = servletContext.getRealPath(relativeWebPath); 
     System.out.println("GoogleConnection: Absolut Path: " + absoluteDiskPath); 

     GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(absoluteDiskPath)) 
       .createScoped(SCOPES); 
     return credential; 
    } 

    public static GoogleCredential authorizeLocal() throws IOException, GeneralSecurityException { 
     String absoluteDiskPath = "H:/ownCloud/Wabco/Workspace/WabcoDiagram/WebContent/resources/webserviceaccount.json"; 
     System.out.println("GoogleConnection: Absolut Path: " + absoluteDiskPath); 

     GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream(absoluteDiskPath)) 
       .createScoped(SCOPES); 
     return credential; 

    } 

    public static Calendar getCalendarService() throws IOException, GeneralSecurityException { 
     Credential credential = authorize(); 
     return new Calendar.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME) 
       .build(); 
    } 

    public static Calendar getCalendarServiceLocal() throws IOException, GeneralSecurityException { 
     Credential credential = authorizeLocal(); 
     return new Calendar.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME) 
       .build(); 
    } 

    public static Sheets getSheetsService() throws IOException, GeneralSecurityException { 
     credential = authorize(); 
     return new Sheets.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); 
    } 

    public static Sheets getSheetsServiceLocal() throws IOException, GeneralSecurityException { 
     credential = authorizeLocal(); 
     return new Sheets.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); 
    } 

    public static Drive getDriveService() throws IOException, GeneralSecurityException { 
     GoogleCredential credential = authorize(); 
     return new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build(); 
    } 

    public static void initializeSheetService() throws IOException, GeneralSecurityException { 
     service = getSheetsService(); 
    } 

    public static void initializeSheetServiceLocal() throws IOException, GeneralSecurityException { 
     service = getSheetsServiceLocal(); 
    } 

    public static void initializeDriveService() throws IOException, GeneralSecurityException { 
     driveService = getDriveService(); 
    } 

    public static void initializeCalendarService() throws IOException, GeneralSecurityException { 
     calendarService = getCalendarService(); 
    } 

    public static void initializeCalendarServiceLocal() throws IOException, GeneralSecurityException { 
     calendarService = getCalendarServiceLocal(); 
    } 

    public static void main(String[] args) { 
     try { 
      initializeSheetServiceLocal(); 
      initializeCalendarServiceLocal(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

答えて

0

My Questions: Can I login with a Service account into the Google Calendar API, or what are the changes I have to do, or is there another error in my code somewhere?

はいあなたはGoogleカレンダーとサービスアカウントを使用することができます。あなたのコードは大丈夫です。あなたが行ったカレンダースコープを追加し、GoogleデベロッパーコンソールのサービスアカウントのGoogleカレンダーAPIを有効にするだけです。

Can I send out Calendar Invites from a Web Service Service account and make another user the Admin/Creator of the event, so he can change the event if necessary? Does this require "domain-wide authority"? I am working for a company that uses GSuit.

はい、サービスアカウントで対応できます。あなたはGsuitの管理者にカレンダーへのサービスアカウントへのアクセス許可を与えなければならないでしょう。そしてイベントを作成して人々を招待することができます。はい、「ドメイン全体の権限」が必要ですか?イベントを挿入したら、パッチにイベントを送信し、誰かを主催者として設定することができます。 check thisそれはしばらくしています。私はこのことをもっと覚えています。

+0

お返事ありがとうございます。 My Codeはthe sheets APIのために働いています。私がカレンダービルダーと同じことをすると、上記のエラーが表示されます。 スコープは既に追加されており、アカウントのカレンダーAPIも有効になっています。 > java.lang.NoSuchMethodError 誤ったインポートのようですか?しかし、私はEclipseのソースコード上でエラーの場所を開くと、メソッドが存在するので、私は何が問題を引き起こしているのか正確にはわかりません。 – Nutria

+0

私はインポートをダブルチェックしましたが、すべてが正しいようです。 返信しようとしています: com/google/api/client/googleapis/services/AbstractGoogleClient $メソッドからメソッドが見つかりません。 ここで何が間違っていますか? – Nutria

+1

エラーは、いずれかの依存関係のバージョンの不一致から作成されました。私は最新の依存関係を取得し、プロジェクトをきれいにし、エラーはなくなりました。 mavenまたはgradleに切り替える必要があります。 ;-) 他の質問にお手伝いいただきありがとうございます。 – Nutria