arcanum_jp’s blog

おっさんの日記

コンストラクタ内でページ遷移をするとき ⇒ RestartResponseException

 だーーーー俺ってなんて忘れやすいんだ!と言う事でメモ。以下、見つけたの貼っておく。RestartResponseExceptionを使うんだよ⇒オレ

Hello guys!
I've got three pages, where I do certain check in the beginning and if the criteria is not met, I redirect to home page. I make it that way:
public MyPageClass {
  if (something) {
     system.out.println("mypageclass - we're in");
     setResponsePage(getApplication().getHomePage());
  }
  .... page initialization afterwards
}

http://apache-wicket.1842946.n4.nabble.com/setResponsePage-in-the-beggining-of-a-constructor-does-not-work-td1868345.html

 例えば、スーパークラス内のコンストラクタで判定をしてsetResponsePage()をしてもうまくいかない。例えば以下のコード

class SuperPage extends WebPage {

    public SuperPage() {

        // なんか条件が合致しないので違うページに飛ばす
        if(なんか変){
            setResponsePage(NotFoundPage.class);
            return;
        }
    }
}

class SubPage extends WebPage {
    public SubPage(){

        // データベース接続とか・・・
    }
}

こういう場合、当然スーパークラスのコンストラクタ⇒具象クラスのコンストラクタの順で処理が進むけど、setResponsePage()をした後にすぐ設定したページに飛ぶわけではないので(この場合具象クラスのコンストラクタでデータベースの接続を使用とする)こういうのはうまくいかない。なので冒頭のRestartResponseExceptionを使う

class SuperPage extends WebPage {

    public SuperPage() {

        // なんか条件が合致しないので違うページに飛ばす
        if(なんか変){
            throw new <b>RestartResponseException</b>(NotFoundPage.class);
        }
    }
}