tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Get Method の注意

以前Getメソッドを使ったVFページを開発中にハマった話です。


Getメソッドを使用しているときで、apex:commandButtonのaction処理を実行すると実行ステップ数が2倍になります。


検証用に次のソースを用意しました。

上記処理ではページ側でGetメソッドを呼び出し取引先リストを取得しています。またボタンクリック時に取引先検索処理を実行するという流れになっています。ちなみにGetメソッド内で行なっているループは検証しやすいようにステップ数を増やしているだけの処理になります。

画面を表示

画面を表示したときはコンストラクタ内での処理とGetメソッド内の処理を合わせて2007ステップ実行されています。
f:id:tyoshikawa1106:20130724233815p:plain

ボタンをクリックして検索処理を実行

ボタンをクリックするとdoSearchの処理が実行されます。予定ではdoSearchの処理の後にGetメソッドで2000ステップが実行されるので消費ステップ数は約2000となる予定ですが次のようになります。

f:id:tyoshikawa1106:20130724234207p:plain

2000ステップの倍の4000ステップ消費されました。


このときのログは次のようになります。
※ステップ数が多いとログが表示できないのでループ数を減らして検証しています。

画面表示時のログ

f:id:tyoshikawa1106:20130724234635p:plain

ボタンクリック時のログ

f:id:tyoshikawa1106:20130724234657p:plain

ボタンクリック時はGetメソッドが最初と最後に実行されていることがわかります。
今回APIのバージョンは27.0で検証していますが、以前ハマったときはもっと前のバージョンだったのでAPIバージョンは関係ないかと思います。

回避方法

このケースはGetメソッドの場合のみ発生するのでApexクラス内でリストにセットしてしまえば問題ありません。

例えばこんな感じです。

この例の場合だと取引先リストから取引先リストへセットしているので意味のない処理になっていますが、実際は内部クラスのリストにセットするような処理を想定しています。

画面を表示

f:id:tyoshikawa1106:20130725001449p:plain

ボタンをクリック

f:id:tyoshikawa1106:20130725001514p:plain

画面表示時のログ

f:id:tyoshikawa1106:20130725001727p:plain

ボタンクリック時のログ

f:id:tyoshikawa1106:20130725001745p:plain

予定どおりに処理が実行されていることを確認できます。
このようにGetメソッド内で大量のステップ数を消費する複雑な処理がある場合はGetメソッドではなくApexクラス内で値をセットして表示するようにした方がいいみたいです。