システム構成
Java + Slim3 で GAE/Java のウェブアプリ開発中・・
どのコントローラーも対応しないルートにリクエストが行ってしまった場合、GAEのデフォルトのエラー404ページが出る。
GAE & Javaでデフォルトのエラーページ
さらっとしすぎでしょ・・
普通カスタマイズしますよね・・?
Slim3コントローラーの話
Slim3ではデフォルトのルーティングルールではイヤな場合、RouterImpl
を実装します。
例:
public class AppRouter extends RouterImpl {
public AppRouter() {
addRouting("/book/{key}/", "/book?key={key}");
}
}
みたいな感じ。
マッチングさせたいルールを記述するんですが、そもそもURL間違えられた場合にはどのコントローラーも対応しません・・状態になります。
では先ほどのさらっとしたエラーページ、誰が出力してんねん?てなりますよね。
さらっとしかエラー出力してくれないヤツ
犯人はログをみると出ています。
com.google.appengine.tools.development.LocalResourceFileServlet doGet
No file found for: /notexists/
この、LocalResourceFileServletさんがやってくれてるんですが・・
カスタマイズどうすんねん!
普通ならServletのweb.xmlですよね・・?
そう。Servletのエラーページと言えば、web.xmlの中で定義するのが定番。
<error-page>
<error-code>404</error-code>
<location>/error/notFound</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error</location>
</error-page>
GAEだって要はServletでしょ!と記述してみても、全く効かない・・・・
やっぱりさらっとした404ページしか出てくれません(涙)
困った時は公式ページ
英語ですが頑張って読みます。
The Deployment Descriptor: web.xml - Java — Google Cloud Platform
がしかし、驚愕の事実が・・
Note: At present, you cannot configure custom error handlers for some error conditions. Specifically, you cannot customize the 404 response page when no servlet mapping is defined for a URL, the 403 quota error page, or the 500 server error page that appears after an App Engine internal error.
404ページのカスタマイズ・・対応してないって・・・マジで??
公式よりあてになったstackoverflow
How to implement a custom 404 error page on App Engine, Java? - Stack Overflow
ここの情報に救われた。
なんと、web.xmlに記述したエラーページが効かないのは、ローカル開発環境のみらしい。
試しにさっきのコードでデプロイしてみたら、ちゃんと動きました。。
結論
- GAE/Javaでエラーページをカスタマイズしたければ
web.xml
に普通のServletと同じくエラーページの記述を追加する - ローカル開発環境では無視されるので、必ず本番環境にデプロイして動くことを確認
GAE、ローカルと本番で動き違いすぎ;;