GeekFactory

int128.hatenablog.com

Google Tasks API Client Libraryを1.3.0にバージョンアップした場合の変更点

Google Tasks APIにはJavaのクライアントライブラリが用意されています。クライアントライブラリ(google-api-services-tasks)のバージョンを1.2.2から1.3.0に上げたときの変更点をまとめておきます。

基本的には一部のメソッドが非推奨になっただけで、後方互換性は確保されています。1.3で非推奨になったメソッドは1.4で削除されるようです。とはいえ@deprecatedの嵐はちときつかった...。

まず、pom.xmlの変更。Maven便利。

		<dependency>
 			<groupId>com.google.apis</groupId>
 			<artifactId>google-api-services-tasks</artifactId>
-			<version>v1-1.2.2-beta</version>
+			<version>v1-1.3.0-beta</version>
 		</dependency>

依存しているライブラリもバージョンが上がります。

公開フィールドへの直接アクセスが非推奨になり、アクセッサメソッドが用意されるようになりました。タスクの操作は tasks() メソッドを使用します。

-		Tasks tasks = tasksService.tasks.list(tasklistID).execute();
+		Tasks tasks = tasksService.tasks().list(tasklistID).execute();

タスクリストの操作は tasklists() メソッドを使用します。

		TaskList taskList = new TaskList();
 		taskList.setId(asString("id"));
 		taskList.setTitle(asString("title"));
-		Patch patch = tasksService.tasklists.patch(asString("id"), taskList);
+		Patch patch = tasksService.tasklists().patch(asString("id"), taskList);
 		TaskList patched = patch.execute();

サービスクラスの生成は Builder クラスを利用するスタイルに変更されました。OAuthトークンを設定するには Builder#setHttpRequestInitializer() でリソースを設定します。

		GoogleAccessProtectedResource resource = new GoogleAccessProtectedResource(
				token.getAccessToken(),
				/* 中略 */,
				token.getRefreshToken());
		Tasks tasksService;
-		tasksService = new Tasks(
-				NetHttpTransportLocator.get(),
-				resource,
-				JacksonFactoryLocator.get());
+		tasksService = Tasks.builder(NetHttpTransportLocator.get(), JacksonFactoryLocator.get())
+				.setHttpRequestInitializer(resource)
+				.build();

GoogleAccessProtectedResource()コンストラクタで、リフレッシュトークンにnullを指定できるようになりました。以前はnullを指定するとぬるぽが出ていました。これでリフレッシュトークンがもらえないケースでも動くようになった・・・と思います*1

リクエストパラメータの設定は JsonHttpRequestInitializer インタフェースにまとめられました。userIp パラメータを設定するには TasksRequest#setUserIp() メソッドを使用します。

		Tasks tasksService;
-		tasksService = new Tasks(
-				NetHttpTransportLocator.get(),
-				resource,
-				JacksonFactoryLocator.get());
-		tasksService.setUserIp(request.getRemoteAddr());
+		JsonHttpRequestInitializer requestInitializer = new JsonHttpRequestInitializer()
+		{
+			@Override
+			public void initialize(JsonHttpRequest jsonHttpRequest) throws IOException
+			{
+				TasksRequest tasksRequest = (TasksRequest) jsonHttpRequest;
+				tasksRequest.setUserIp(request.getRemoteAddr());
+			}
+		};
+		tasksService = Tasks.builder(NetHttpTransportLocator.get(), JacksonFactoryLocator.get())
+				.setHttpRequestInitializer(resource)
+				.setJsonHttpRequestInitializer(requestInitializer)
+				.build();

JsonFactory を設定するメソッドが用意されました。以下は新しいJSONオブジェクトを生成する例です。

 			GenericJson json = new GenericJson();
-			json.jsonFactory = JacksonFactoryLocator.get();
+			json.setFactory(JacksonFactoryLocator.get());

JavaVMのデフォルトエンコーディングにより GenericJson#toString() の結果が文字化けするバグが修正されました。これ以外にもデフォルトエンコーディングに依存する部分が修正されています。App Engineで安心して利用できるようになりました。

現時点で認識している変更点は以上です。

*1:12/8ぐらいからGoogle APIs OAuth 2.0の挙動が変わったように見えるので調査中です。