Liftでカスタムエラーページを表示する
Lift使ってて予期しない例外とか起きたとき、画面上にでれでれでれっとStackTraceが出ちゃいますよね。(Development Modeのとき。)
まあ、Production Modeであったとしても、カスタムエラーページを表示するにはどうすれば良いんだろうと思って調べたんです。
あんま情報ないような気がするんですけど。。
で、とりあえず捻出した方法が以下。
まず最初に、LiftRules.exceptionHandlerの記述をBoot.scalaに書きます。
LiftRules.exceptionHandler.prepend { case (Props.RunModes.Production, Req(path, "", GetRequest), e) => { Log.error("Unexpected Exception") Log.error(e.fillInStackTrace) RedirectResponse("/error") } }
これで、error.htmlを用意しておけばオーケー。
ただこれだと、Liftの処理系自体に問題があったり、テンプレートに問題があったりでエラーページ自体が処理できないと、
このウェブページにはリダイレクト ループが含まれています。
なんてブラウザがおっしゃるので、これも何とかしたいところ。
web.xmlの方で特殊な設定をすることも考えたのですが、今更そんなこともしたくないので考えたのが以下の方法。
まず、エラーページ出力用のメソッドを用意。ファイルを静的に読んで、StreamingResponseを返します。
(error.htmlの置き場所&内容は上記とは違いますよ、念のため)
def sendErrorPage = { val file = new File("WEB-INF/error.html") val fis = new FileInputStream(file) StreamingResponse( fis, () => { fis.close }, file.length, ("Content-Type" -> "text/html") :: Nil, Nil, 503 ) }
んで、先程の RedirectResponse("/error") の代わりにこのメソッドを呼んでやります。
(それでも、error.htmlが読めなければ結局これも拾いきれないですけどね。。)
しかし、Liftって本当クセ強いよなぁ。。
もっとかっちょいい方法誰か知ってたら教えて下さい!!