03 Apr 2017

1. 例外発生時にきちんとハンドリングする

1-1. Spring定義ファイルで例外ハンドラを設定する

ここではアプリケーション全体で統一した例外ハンドリング方法について学習します。
Spring MVC の Bean 定義ファイルに、例外ハンドラ(SimpleMappingExceptionResolver)の設定を追記してください。

1-1-1. /src/main/webapp/WEB-INF/spring/application-context-web.xml

  <!--
    @@@@ 省略
    @@@@ -->

  <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

  <!--
    @@@@ 28行目付近
    @@@@ 例外ハンドラーのて定義を追加
    @@@@ -->

    <!-- Exception Handler -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!-- 必要に応じて prop を追加すること -->
                <prop key="org.springframework.dao.DataAccessException">error/dberror</prop>
                <prop key="java.lang.Exception">error/syserror</prop>
            </props>
        </property>
    </bean>

  <!-- @@@@ ここまで @@@@ -->

</beans>

SimpleMappingExceptionResolverを利用した例外ハンドリングについての詳細は「Spring3入門」の240ページ(第6章)が参考になるでしょう。なお SimpleMappingExceptionResolver を使用せず、コントローラクラスごとに例外処理を自分で実装する方法もありますが、この方法については「Spring3入門」の237ページ(第6章)を参照してください。

1-2. 例外発生に表示するエラー画面JSPを用意

1-2-1. /src/main/webapp/WEB-INF/views/error フォルダを新規作成

エラー画面JSPを格納するフォルダ(/src/main/webapp.WEB-INF/views/error)を新規作成

1-2-2. /src/main/webapp/WEB-INF/views/error/dberror.jsp を新規作成

データベースエラー画面JSP(error/dberror.jsp パスに注意)を新規作成し、次のようにコーディング

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="css/bookmgr.css" />
    <title>データベースエラー画面</title>
</head>
<body>
    <h1>データベースエラー発生!!</h1>
    <hr />
    書籍管理プログラムでデータベースに関するエラーが発生しました!!!

    <dl style="color:red">
    <dt>例外クラス名</dt><dd><c:out value="${exception['class'].name}"/></dd>
    <dt>メッセージ</dt><dd><c:out value="${exception.message}"/></dd>
    </dl>

    <hr />
    <a href="main">書籍管理メイン画面</a> 
</body>
</html>

1-2-3. /src/main/webapp/WEB-INF/views/error/syserror.jsp を新規作成

システムエラー画面JSP(error/syserror.jsp パスに注意)を新規作成し、次のようにコーディング

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>    
<html>
    <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="css/bookmgr.css" />
    <title>システムエラー画面</title>
</head>
<body>
    <h1>システムエラー発生!!</h1>
    <hr />
    書籍管理プログラムでシステムエラーが発生しました!!!

    <dl style="color:red">
    <dt>例外クラス名</dt><dd><c:out value="${exception['class'].name}"/></dd>
    <dt>メッセージ</dt><dd><c:out value="${exception.message}"/></dd>
    </dl>

    <hr />
    <a href="main">書籍管理メイン画面</a> 
</body>
</html>

1-3. 画面表示テスト

1-3-1. /src/main/resource/jdbc.properties

ここで、あえてデータベース関連の例外を発生させるため、jdbc.properties のパスワードに誤った値を設定します。

jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/springdb
jdbc.username=postgres
jdbc.password=wrong_password  ◆◆◆<--- DB接続パスワードを不正なものに変更してみます!

1-3-2. 画面表示テスト

書籍管理プログラムを起動し、書籍一覧画面を表示してみましょう。データベース接続に失敗するため、データベースエラー画面が表示されるはずです。

dbError Image

テスト完了後は、jdbc.properties のパスワードを正しい値「nttat123」に直しておいてください。