Developer

『Cyclical server-side forwards detected』というエラーに遭遇したのでまとめておく

Developer
この記事は約4分で読めます。

こんにちは、アンダーソンです。
今日は久々に開発ネタになります。

Cyclical server-side forwards detected
というエラーなんですが、もしかすると今これを読んでいただいてる方は
Googleで検索して直接きていただいたかもしれませんね。

僕自身初めて遭遇したエラーなので、原因と対処法をまとめておきたいと思います。

スポンサーリンク

『Cyclical server-side forwards detected』というエラー

Cyclical server-side forwards detectedは直訳すると

周期的なサーバー側転送が検出されました

周期的なサーバー側の転送という事なので、
リクエストが何度も行ったのか?という疑問が湧きました。
結論からいうと、無限ループを作ってしまっていたのが原因だったんですが。

今回のエラーの原因となったコードを置いておきます。
※今回のコードはダメな例です。真似しないでください。

public class Test {
    // コンストラクタ
    public Test() {
        Id roleId = [SELECT Id FROM UserRole Where Name = '人事部長'].Id;
    }
    // ページロード
    public Pagereference pageLoad(){
        if ( UserInfo.getUserRoleId() == roleId ) {
            return new Pagereference('どこか指定のページ');
        } else {
            return new Pagereference('/apex/test'); //←このコントローラ使ってるページ
        }
    }
}
<apex:page controller="Test" action="{!pageLoad}">
    <!-- なんかいろいろ書いてるページ -->
</apex:page>

こんな感じのページを作って、条件に応じて
他のページに遷移させる
条件に合致していなければこのページのままにするってことをしたかったんですが、

return new Pagereference(‘/apex/test’); //←このコントローラ使ってるページ

ここがいらなかったようで、
pageLoad呼び出す→判定でまたこのページ呼び出す→pageLoad呼び出す→判定で・・・

みたいな感じで無限ループが発生し、サーバー側で
あかんあかんとなったようです。
それが冒頭のCyclical server-side forwards detectedというエラーにつながります。

対処法は?

対処法は簡単です。
判定でまたこのページを呼び出すをやめたらOKです。

public class Test {
    // コンストラクタ
    public Test() {
        Id roleId = [SELECT Id FROM UserRole Where Name = '人事部長'].Id;
    }
    // ページロード
    public Pagereference pageLoad(){
        if ( UserInfo.getUserRoleId() == roleId ) {
            return new Pagereference('どこか指定のページ');
        } else {
            return null;
        }
    }
}

Pagereferenceではなくnullを返してあげればOKです。
これでそのままのページに留まってくれます。


久々にVF触ったので、なかなか自分でも面白いことをしてしまったなと
反省です笑
でも初めて見たエラーに遭遇できたので楽しかったです。
またこういったエラーに遭遇した際は記事にしたいと思います。

その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。

コメント