こんにちは、アンダーソンです。
今日は久々に開発ネタになります。
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触ったので、なかなか自分でも面白いことをしてしまったなと
反省です笑
でも初めて見たエラーに遭遇できたので楽しかったです。
またこういったエラーに遭遇した際は記事にしたいと思います。
コメント