SpringMVCのエラー系・異常系画面遷移
社内の人が研修でSpringMVCやってるらしいので、流行りに乗ってやってみました。といっても、やることと
1. システム例外発生時のエラー画面遷移
2. DBからデータを検索してきたときに、404エラーへ飛ばす。
の2本でお送りします。ソースはGitHub上へここへ公開済みです。
1.システム例外時のエラー画面遷移
実はこれ、Spring関係無かったりします。
Tomcat(それともservlet?)の仕様です。web.xmlに以下のように書けばOK。
この場合は404エラーの場合は/error/404.html画面に遷移します。
また、例外の種類ごとにも制限ができます。
これだけ。ちなみにlocationの設定は外部へリダイレクトとかは出来なかったはず。
高負荷時の時にどうやってTomcatの外(Apacheとか)へ逃がすか考えないと、無限ループになります。
<error-page> <error-code>404</error-code> <location>/error/404.html</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error/error.html</location> </error-page>
2.DBからデータを検索してきたときに404エラー画面へ飛ばす。
ここでのポイントは404エラーへ飛ばすということ。
Web屋のネタ帳「ステータス200なのに「その商品はありません」」の記事はあまりにも有名。
ということでそれに習ってやってみました。
今回はデータが存在しない=ユーザがURLを適当に入力して検索したという想定で、
データがないときには、例外を投げるようにしました。
ポイントは@ResponseStatus(value = HttpStatus.NOT_FOUND)で
こうすると、HttpStatus.NOT_FOUND(=404)をレスポンスコードにセットしてくれます。
そうすると上で設定した404エラーの画面に遷移します。
ちなみに違いはこんな感じです。
↓@ResponseStatus(value = HttpStatus.NOT_FOUND)なし↓
↓@ResponseStatus(value = HttpStatus.NOT_FOUND)あり↓
Javaコード
@ResponseStatus(value = HttpStatus.NOT_FOUND) public class NotFoundException extends RuntimeException{ private static final Logger logger = LoggerFactory.getLogger(NotFoundException.class); private static final long serialVersionUID = 1L; public NotFoundException(String message){ super(message); if(logger.isErrorEnabled()){ logger.error(message); } } public NotFoundException(String message, Throwable cause){ super(message,cause); if(logger.isErrorEnabled()){ logger.error(message); } } }