Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

Visualforce エラー「View State limit (170) exception root cause (ビュー状態の制限 (170) 例外の根本原因)」

公開日: Jun 26, 2023
説明
※この記事は英語版を翻訳しており、一部機械翻訳を含むため内容は後日更新される可能性があります。最新の内容は英語版を参照してください。表示言語は画面右下の言語名から切り替えられます。

1.「Maximum view state size limit (170KB) exceeded.Actual view state size for this page was <Above_170KB>KB, internally (ビューステートのサイズの最大制限 (170KB) を超過しました。このページの実際のビューステートのサイズは、内部では <Above_170KB>KB でした」のエラーが発生します。
2.外部ユーザー (コミュニティ、サイトゲストユーザー) の場合は、「Error while loading a VF page (VF ページの読み込み中にエラーが発生しました)」というエラーが発生して例外ページしか表示されないことがあります。
- 少数のレコードでも断続的にこのエラーが発生する場合は、「ビューステートのサイズ制限」超過のエラーが発生する可能性があります。確認するには、開発者サポートにケースを登録し、サーバーログをチェックして確認するよう依頼してください。

 
解決策
全般: 一般的に HTTP はステートレスプロトコルです。そのため、HTTP で「状態」を実装するネイティブな方法はありません。

Salesforce では、変数の特定の状態を認識する必要があります。このような状態は、コントローラー内のプロパティの値である可能性があります。

Salesforce の例: Visualforce で簡単なフォームを実装するとします。
<apex:page controller="myController">     <apex:form>         <apex:commandButton value="do" action="{!do}"/>     </apex:form> </apex:page> The corresponding controller looks like this: -Controller- public class myController {     public String abc;     public myController()     {     abc = 'def';     }     void do()     {     } }

Salesforce は次のようにページを実行します (簡略化されています)。
  • Visualforce ページを読み込み、タグコントローラーを検出する
  • Apex クラスが呼び出され、コンストラクタが実行される
  • コンストラクタによって変数 abc が初期化される
  • 変数の値が Visualforce ページの [view state (ビューステート)] 項目に保存される
  • ページがクライアントに送信される

ユーザーが [実行] ボタンを押すと、do() が呼び出されます。
  • ブラウザが POST リクエストを開始し、Salesforce にデータを送信する
  • リクエストの一部はビューステート
  • Salesforce がビューステートを「読み取り」、コンストラクタを再度呼び出すことなく変数 abc を再初期化する
  • Salesforce が「do」メソッドを実行する

ビューステートを小さくするために、以下を使用します。
1.「一時的な」キーワード - 保存できないインスタンス変数を宣言し、Visualforce ページのビューステートの一部として送信しないようにします。
例:
---
transient DateTime theDate;
DateTime theOldDate;
---
ここで theDate によって、一時的な日付が更新されます。ページが更新されるたびに再作成されるようになっています。一方、theOldDate の値はビューステートから逆シリアル化され、同じ値のままとなります。

2.ページ上のフォーム (<apex:form> など) の数を最小限にします。2 つ以上のフォームを使用する代わりに、<apex:actionRegion> を使用します。

3.SOQL を絞り込んで、必要なデータのみを取得します。

4.標準、カスタム、コントローラーの拡張機能に存在するすべての公開および非公開の日付メンバーは、ビューステートの一部として保存されます。したがって、ページの状態に保存されない一時的な変数を使用します。

5.<apex:commandlink> や <apex:commandbutton> を使用する代わりに、<apex:outputlink> を使用します。 

このことは公開記事にも記載されています。この記事では、一般的な原因とその回避方法を説明しています。

VF ページでビューステートを確認する簡単な方法はこちらで説明されています。

ビューステートに関する追加情報

簡単な解決策としては、[View state (ビューステート)] タブを使用して状態を取得しすぎている変数を見つけ、上記のような変数を含むコントローラーで「一時的な」キーワードを使用できます。
ナレッジ記事番号

000384480

 
読み込み中
Salesforce Help | Article