J2EE/サーブレットWebアプリケーションでは、エラーページをマップして次のような例外を指定できます。

web.xml

  <error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/pages/404.jsp</location>
  </error-page>

  <error-page>
    <exception-type>com.mkyong.web.exception.CustomException</exception-type>
    <location>/WEB-INF/pages/error/custom__error.jsp</location>
  </error-page>

  <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/pages/generic__error.jsp</location>
  </error-page>

上記のコードは自己探検であるべきです。例外処理関数がサーブレットコンテナに存在する場合、例外を処理するためにSpringを使用する必要があるのはなぜですか?

一般に、2つの理由があります。


  1. カスタマイズ・エラー・ページ

    – サーブレット・コンテナはエラーをレンダリングします

直接ページ。 Springではモデルやデータをエラーページに埋め込むことができるので、より使いやすいエラーページをカスタマイズできます。


  1. ビジネスロジック

    – Springでは余分なビジネスロジックを適用できます

エラーページを表示する前に、ロギング、監査など

このチュートリアルでは、Springで例外を処理する2つの例を示します。

  1. Spring 2.xでは、XMLで `SimpleMappingExceptionResolver`を使います

ファイル。

  1. Spring 3.xでは、XML設定を単純化することができます.

@ ExceptionHandlerアノテーション。

1. SimpleMappingExceptionResolverの例

ディレクトリ構造を確認します。


spring-mvc-exception-example-directory、width = 491、height = 496

カスタム例外。

CustomGenericException.java

package com.mkyong.web.exception;

public class CustomGenericException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private String errCode;
    private String errMsg;

   //getter and setter methods

    public CustomGenericException(String errCode, String errMsg) {
        this.errCode = errCode;
        this.errMsg = errMsg;
    }

}

このコントローラークラスは、カスタムエラーコードとエラーの説明で `CustomGenericException`をスローします。

CustomerController.java

package com.mkyong.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import com.mkyong.web.exception.CustomGenericException;

public class CustomerController extends AbstractController {

  @Override
  protected ModelAndView handleRequestInternal(HttpServletRequest request,
    HttpServletResponse response) throws Exception {

    throw new CustomGenericException("E888", "This is custom message - ABC");

  }

}

以下の `SimpleMappingExceptionResolver`を見直してください:

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.mkyong"/>

    <bean
    class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!-- Register the bean -->
    <bean class="com.mkyong.web.controller.CustomerController"/>

    <bean
      class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      <property name="exceptionMappings">
        <props>
            <prop key="com.mkyong.wb.exception.CustomGenericException">
                error/generic__error
            </prop>
            <prop key="java.lang.Exception">error/exception__error</prop>
        </props>
      </property>
    </bean>

    <bean
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <mvc:annotation-driven/>

</beans>

上記において、

  1. CustomGenericExceptionがスローされ、ビュー名にマップされます.

“error/generic__error”

  1. 他の例外がスローされ、ビュー名にマップされます

“error/exception__error”。

JSPページでは、 `$ {exception}`を介して例外インスタンスにアクセスできます。

pages/error/generic__error.jsp.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>

    <c:if test="${not empty exception.errCode}">
        <h1>${exception.errCode} : System Errors</h1>
    </c:if>

    <c:if test="${empty exception.errCode}">
        <h1>System Errors</h1>
    </c:if>

    <c:if test="${not empty exception.errMsg}">
        <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-format="fluid"
     data-ad-layout="in-article"
     data-ad-client="ca-pub-2836379775501347"
     data-ad-slot="6894224149"></ins>
<script>
     (adsbygoogle = window.adsbygoogle ||[]).push({});
</script><h2>${exception.errMsg}</h2>
    </c:if>

</body>
</html>


spring-mvc-exception-handle-1、width = 595、height = 331

ダウンロードする –

SpringMvc-SimpleMappingExceptionResolver-Example.zip

(13KB)

2 @ExceptionHandlerの例

Spring 3.0以降、XML設定を単純化するための新しい注釈「@ExceptionHandler」があります。以下は `@ ExceptionHandler`を使った同等のバージョンです。

CustomerController.java

package com.mkyong.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.mkyong.web.exception.CustomGenericException;

@Controller
public class CustomerController {

    @RequestMapping(value = "/customer", method = RequestMethod.GET)
    public ModelAndView getPages() throws Exception {

        throw new CustomGenericException("E888", "This is custom message X");

    }

    @ExceptionHandler(CustomGenericException.class)
    public ModelAndView handleCustomException(CustomGenericException ex) {

        ModelAndView model = new ModelAndView("error/generic__error");
        model.addObject("exception", ex);
        return model;

    }

    @ExceptionHandler(Exception.class)
    public ModelAndView handleAllException(Exception ex) {

        ModelAndView model = new ModelAndView("error/exception__error");
        return model;

    }

}

Spring XMLファイルで宣言するものは何もありません。

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.mkyong"/>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <mvc:annotation-driven/>

</beans>

ダウンロードする –

SpringMvc-ExceptionHandler-Example.zip

(15KB)

リファレンス

JavaDoc]。リンク://spring-mvc/spring-mvc-exceptionhandler-example/[Spring MVC

@ExceptionHandlerの例]

リンク://タグ/例外ハンドラ/[例外ハンドラ]

spring mvc