こんにちは。開発ブログ運営担当のktです。

GSuiteを会社で利用されているところも多いと思います。

GSuiteで管理されているデータにアクセスするAPIはGoogleから提供されていますが、

今回はJavaでそのAPIを利用してGSuiteのユーザー情報の電話番号を更新する方法を紹介しようと思います。

ニッチな内容ですが、自分と同じようにつまづいた人の役に立てばと思います。

前提

GSuiteのJavaAPIを利用できる環境は作成済みとします。

下記参考URLにマニュアルがあります。

https://developers.google.com/admin-sdk/directory/v1/quickstart/java

英語での説明ですが、以前紹介した翻訳方法を利用すれば理解しやすくなります。

Chromeの拡張機能を利用した翻訳

上記マニュアルの「Step 3: Set up the sample」にあるDirectory.Builderを利用して、

APIを呼び出すDirectoryオブジェクトである変数serviceを取得した後からの説明です。

“hoge@example.com”アカウントに電話番号“123-456-789″を登録します。

間違った実装

UserPhone phone = new UserPhone();
phone.setValue("123-456-789");
phone.setType("mobile");
User user = new User();
user.setPhones(phone);
service.users().update(“hoge@example.com”, user).execute();

実行するとエラーが発生しないで終了します。

でも電話番号は変更されていません。

うまくいった実装

UserPhone phone = new UserPhone();
phone.setValue("123-456-789");
phone.setType("mobile");
List<UserPhone> list = new ArrayList<>();
list.add(phone);
User user = new User();
user.setPhones(list);
service.users().update(“hoge@example.com”, user).execute();

ListにUserPhoneオブジェクトを追加してから、
そのlistをUserオブジェクトに設定して実行すると電話番号が登録されました。

解説

電話番号は複数持つことができるため、

Listで設定する必要がありましたがAPIの引数の型はObjectになっており、

JavaDocにも複数持てるようにListで設定するような記載はありませんでした。

https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/java/latest/

APIの引数の型がList<UserPhone>だったら分かりやすいのに、

どうしてObjectになっているんでしょうね?

Google先生のことなんで何か意味があるんでしょう。

まとめ

これで1,2時間つまづきました。

せめて正常終了せずにエラーで返してよと思いましたが、

メソッド名がsetPhonesと複数形なので英語が得意な人ならすぐに気付くのでしょう。

APIと同様に他の人が利用する共通部品を実装することがあるかと思います。

機能が連想できるメソッド名を付けることや適切な型の設定、

必要ならJavaDocに利用方法を記載することが大切ですね。

余談

ロシアW杯でクロアチア代表にモドリッチという選手がいます。

この名前を聞いて「戻り値」を連想してしまうSEは私だけではないはず・・・。