SpringBootのアプリケーションからSalesforceのオブジェクトを操作する

はじめに

SpringBootのアプリケーションからSalesforceのオブジェクトを参照する方法をはじめ、登録や更新する方法をかんたんなサンプルを通して紹介します。Salesforceへ接続するためのアプリケーション連携設定も紹介します。

Salesforceの設定

必要な作業は、次の2つです。

  • Salesforceで連携用ユーザの作成
  • Salesforce接続アプリケーションの登録

ユーザの作成

最初にSalesforceへ接続するためのユーザを作成します。既にあるユーザも利用可能ですが、Salesforceの外部から接続するアプリケーション専用のユーザを別途作ることで、アクセス制御の設定を個別に設定できますので今回は新規作成を選びます。

トップ画面の右上にある設定(歯車のアイコン)を押し

トップ画面から設定を開く

画面左のメニューにある 管理 > ユーザ > ユーザ を押して、ユーザ一覧を開きます 。画面下までスクロールして「新規ユーザ」を押します

ユーザ一覧画面

ユーザがログインするメールアドレスや権限などの必須項目を入力したあと、画面最下部の左にある「保存」ボタンを押します。

ユーザ作成

するとSalesforceから作成したユーザのメールが届きますので、「アカウントを確認」ボタンを押します。

ユーザ作成確認メール

Salesforceの画面が表示され、パスワード登録画面へ遷移します。

パスワード登録画面

パスワードポリシーに従い各項目を入力して、「パスワードを変更」ボタンを押します。 登録が完了するとSalesforceのメニュー画面が表示され、ユーザ登録が完了します。

ユーザのセキュリティトークン生成

続いて作成したユーザのセキュリティトークンを生成します。画面右上の「私のプロファイル」をクリックし、私の個人情報>私のセキュリティトークンを選択し、「セキュリティトークンのリセット」ボタンを押します。

セキュリティトークンのリセット

セキュリティトークンが発行され、作成したユーザのメールアドレスへ届きます。この内容を手元に控えておきます。

セキュリティトークン発行後

接続アプリケーションの追加

先程までの作業で、ログインセッションが追加したユーザへ変わっていますので、一度ログアウトして管理者権限のあるユーザでログインしなおします。

ログインし直した後、接続アプリケーションを追加します。 ユーザ作成と同様、トップメニューの右上にある設定(歯車のアイコン)から、プラットフォームツール>アプリケーション>アプリケーションマネージャ を選択したあと、右端にある「新規接続アプリケーション」をクリックします。

アプリケーション一覧と追加画面

接続アプリケーション情報を入力していきます

  • 基本情報
    • 接続アプリケーション名:任意の名前
    • API参照名:任意の半角英数、ここでは apptest とします
    • 取引責任者メール:登録したユーザと同じメールアドレス
  • API (OAuth 設定の有効化)
    • OAuth 設定の有効化:チェックをON
    • コールバック URL:今回は特に用いませんが、http://localhost を登録

基本情報とAPIの設定

画面を下にスクロールして、権限の範囲を選びます。今回はかんたんにフルアクセスを許可します。

権限設定

その他の項目はデフォルトのままで「保存」を押します。 すると、反映時間が10分ほど必要である旨の以下の画面が表示されますので、「次へ」を押します。

反映確認

コンシューマーキーの設定

作成したアプリケーションを再表示して、画面中程にあるコンシューマーキーと秘密「コンシューマーの詳細を管理」ボタンを押して、Salesforceへ接続するアプリケーションが利用するコンシューマーキーの発行をします。

コンシューマーキーの設定開始

するとSalesforceから連携用IDの確認画面が表示されるとともに、アプリケーション登録したメールアドレスへ確認コード(6桁の数値)が発行されますので、確認コードを入力して「検証」ボタンを押します

接続アプリケーションのID連携確認

確認コードが一致すると、接続アプリケーションに設定されたコンシューマーキーのペアが表示されます。このキーペアを接続アプリケーションから使います。

コンシューマーキーの生成結果

以上でアプリケーションの連携設定は完了です。

SpringBootアプリケーションの作成

Salesforceへ接続するSpringBootアプリケーションを作成します。利用バージョンは 3.1.0 です。

ビルド定義

Salesforceとの接続やデータアクセスは、https://spockframework.org/ を利用した単体テストから実行しますので必要な依存関係を追加します。

gist.github.com

Salesforceの接続設定

今回は接続の設定をapplication.ymlに定義し、プロパティクラスから参照する方式を採用します。

gist.github.com

gist.github.com

接続ユーザのメールアドレス、パスワード、コンシューマーキーの組み合わせと、セキュリティトークンをそれぞれ設定します。接続アプリケーションのドメイン(今回はapplication-urlの名前にしています)は認証後に取得しますので、今のところは仮の値を設定しています。

Salesforceにログインする

ここまで設定してきた内容でログインできるかを検証します。

認証を行うRepositoryクラスと、認証結果のモデルクラス。認証結果のJSONはSnakeCaseなので、AuthenticationResultクラスにjacksonの設定で SnakeCaseStrategy を追加*1しています。

gist.github.com

WebClientの作成:

gist.github.com

この認証クラスを実行するテストコード:

gist.github.com

認証が成功した結果をログへ出力していますので、例えば以下のように出力され、テストは成功します。

gist.github.com

この instance_url の値がお使いのSalesforceの接続ドメインになりますので、application.ymlで仮設定していた 接続アプリケーションのドメイン(application-url) をこの内容に書き換えます。

以上でSalesforceの認証設定まで完了し、準備が整いました!

データを登録する

今回はSalesforceの登録済みオブジェクトである「取引先」を使って、データの登録を行います。

取引先を登録するクラス CompanyRepository を作成し、取引先を扱うクラス Company と、登録結果を汎用的に受け取るクラス RegisterResult*2も作成します。

なお、SalesforceのREST APIで返されるJSONの変数は先頭大文字のキャメルケース(UpperCamelCase)*3なので、取引先クラス Company に UpperCamelCaseStrategy のjacksonの設定を追加しています。

gist.github.com

このRepositoryを使って取引先を登録する単体テストは、例えば以下のようになります

gist.github.com

このテストクラスでは、取引先の名称と、取引先を登録する時に必須項目であるレコードタイプの2つだけ設定します。このテストでは失敗の例も含めています。 実行結果はRegisterResultに格納され、コンソールに出力されます。

登録結果

*項目名 *解説
id 作成に成功したSalesforceのオブジェクトid
success 成功時はtrue
errors Salesforceから返されるエラー情報(複数可)

登録結果のerrors詳細

*項目名 *解説
message エラーの概要メッセージ
errorCode Salesforceが返すエラーコード
fields エラーの発生した項目名(複数あり)

登録した取引先を確認する

登録した取引先をSalesforceで参照してみます。Salesforceのメニューから取引先を一覧表示します。

登録した取引先をSalesforceから参照する

きちんと登録されていました! なお、参照した取引先のURLを見ると、先ほど登録が成功したidになっています。

登録したデータを参照する

先ほど作成した取引先の内容を、SpringBootのアプリケーションからも検索してみましょう。 登録時に作成したRepositoryクラスに参照用のメソッドを追加し、登録のときと同様、テストクラスを作成して実行します。

Salesforceに作成したオブジェクトは、常に /sobjects/オブジェクト名/オブジェクトid のパスで構成されます。今回の取引先は、オブジェクト名がAccount、オブジェクトidは 0010l00001dKTpjAAG ですので、検索するクラスとそれを実行する単体テストクラスも以下のようにURLを設定します。

gist.github.com

オブジェクトの内容が無事表示されましたね!

データを更新する

先ほど作成した取引先の内容を更新してみましょう。参照と同様に、登録時に作成したRepositoryクラスに更新用のメソッドを追加します。 登録のときと同様、更新もテストクラスを作成して実行します。

gist.github.com

実行した後、Salesforceの同じ取引先を参照すると取引先の名称が更新がされています。

更新した取引先情報

データを削除する

同じ取引先を使って削除を行います。Repositoryクラスに削除用のメソッドを追加し、テストクラスも同様、削除用の単体テストを作成して実行します。

gist.github.com

実行後、取引先一覧を開いてすべての取引先を選ぶと、先ほど更新した取引先「更新テストを行った会社」が表示されていませんので、削除されたことが確認できます。

削除後のすべての取引先一覧

登録済みのデータを一括取得する

検索するときには、特定の条件に合致したものをすべて一括で取得したいケースがあります。SalesforceのREST APIを使ってもある程度の件数は取得できますが、数千件以上のデータを取得する場合には一括処理用の Bulk API 2.0 developer.salesforce.com を使うと高速に大量のデータを取得できます。

Bulk API 2.0を使う手順は以下のとおりです

  • Bulk API 2.0で実行するクエリをジョブとして登録する
  • ジョブ登録完了後にクエリを実行する

今回はBulk API 2.0 を実行して取得するデータにCSV形式を選択します。jackson-dataformat-csv を使います。

bulk 2.0を利用して大量データ出力の準備

一括取得するクエリをジョブ登録します。登録のURLパスは /jobs/query です。 今回の検索クエリは、取引先のid、名前、レコードタイプを取得するクエリを用います。

gist.github.com

クエリジョブ登録も今までと同様にREST APIを使ってSalesforceへ登録します。登録が成功すると、上記のログのように、作成したジョブに関する情報が返されます。作成したクエリジョブのidは id の値です。

登録したジョブから一括で取得

登録したジョブから結果を取得します。大抵は数秒もかからずジョブは登録できデータの取得も可能ですが、クエリの複雑度やデータ量によってはジョブ作成完了までに少し時間がかかります。

ジョブの取得パスは /jobs/query/クエリジョブのid/results?検索オプション で指定します。

gist.github.com

無事に取得できましたね!

まとめ

SpringBootアプリケーションからSalesforceのオブジェクトを登録、更新、削除、検索、一括検索するサンプルコードを紹介しました。

一度やり方を確立できればそこまで難しくはありませんので、Salesforceのカスタムオブジェクトへの応用にも簡単に対応できるかと思います。

最後に

アソビューではより良いプロダクトを世の中に届けられるよう共に挑戦していくエンジニアを募集しています。カジュアル面談もやっておりますので、お気軽にエントリーください! お待ちしております。

www.asoview.com

*1:WebClient作成時にexchangeStrategyで設定するのも可です

*2:SalesforceからレスポンスされたJSONを参考にして、今回の型を作成しています

*3:WebClientのexchangeStrategyに登録して全体的に設定するのでも特に問題はありません