イマイチ理解できていなかったところのあるRemoteAction / JSON / extendsについて勉強しました。
extendsについて
Apexクラスではextendsを宣言することで別のクラスを継承できます。これにより他のクラスでも使用できる処理を共通化することが可能です。
extendsで呼び出すApexクラスはabstractを宣言する必要があります。
今回確認したかったのは、extends内にある処理をRemoteActionで実行できるかどうかです。試してみたところ問題なく実行できました。
共通で使用するRemoteAction処理が多い場合は、extendsで継承させるといいかもしれません。
RemoteActionとJSONについて
RemoteActionを実行するときにセットする引数はsObject型として渡すことができません。そのため、Page側から渡す値が多くなると引数の数が増えて大変になってしまいます。
そんなときは引数をJSON文字列として渡す方法が便利です。これにより1つの引数で複数の情報を渡すことが可能になります。
JavaScript内でJSON文字列を用意する方法
JSON文字列を用意するには、まずJavaScript内でobjectを用意します。次のような感じです。
これでNameとAccountNumberという変数を持ったaccountというobjectを用意できました。次のように値をセットできます。
値のセットが完了したら、JSON.stringify()を使ってJSON文字列に変換します。
Apexクラス内ではString文字列として扱われます。
この時の値は次のようにセットされています。
テストクラス作成時にテストデータとして用意したい場合はこんな感じです。
値の受け渡しが上手くいったところでApexクラス内で使用するために文字列からMapに変換します。変換にはJSON.deserializeUntyped()が便利です。これでobjectの変数名をキーに各値がセットされたmapを取得できます。
Mapから値を取得する方法はこんな感じです。
後は通常通りに処理を実装するだけです。JSON.deserialize()のように値受け取り用のクラスを用意したりする必要も無いのでシンプルなコードになります。
JSON.deserializeUntyped()の使い方はこちらで紹介されていました。
勉強用に作成したサンプルコードです。
RemoteActionはまだまだ活躍する機能だと思うので使い方を覚えておくと便利だと思います。