読者です 読者をやめる 読者になる 読者になる

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);
          }
     }
}