Spring MVC @ExceptionHandler Пример

Spring MVC @ExceptionHandler Пример

В этом руководстве мы покажем вам, как выполнять обработку исключений в средах Spring MVC. Обычно мы используем@ExceptionHandler, чтобы решить, какое «представление» должно быть возвращено, если возникает определенное исключение.

P.S This @ExceptionHandler class is available since Spring 3.0

1. Структура проекта

Просмотрите структуру каталогов проекта, стандартный проект Maven.

directory structure

2. Пользовательское исключение

Пользовательское исключение с пользовательским кодом ошибки и описанием ошибки.

CustomGenericException.java

package com.example.web.exception;

public class CustomGenericException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private String errCode;
    private String errMsg;

    public String getErrCode() {
        return errCode;
    }

    public void setErrCode(String errCode) {
        this.errCode = errCode;
    }

    public String getErrMsg() {
        return errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

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

}

3. Spring Controller

Контроллер Spring, просмотрите потоки выполнения ниже:

  1. Если пользователь предоставляет запрос/error, он генерирует исключение CustomGenericException, и методhandleCustomException() запускается.

  2. Если пользователь предоставляет запрос/io-error, он генерирует «IOException», и методhandleAllException() запускается.

MainController.java

package com.example.web.controller;

import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.example.web.exception.CustomGenericException;

@Controller
public class MainController {

    @RequestMapping(value = "/{type:.+}", method = RequestMethod.GET)
    public ModelAndView getPages(@PathVariable("type") String type)
        throws Exception {

      if ("error".equals(type)) {
        // go handleCustomException
        throw new CustomGenericException("E888", "This is custom message");
      } else if ("io-error".equals(type)) {
        // go handleAllException
        throw new IOException();
      } else {
        return new ModelAndView("index").addObject("msg", type);
      }

    }

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

        ModelAndView model = new ModelAndView("error/generic_error");
        model.addObject("errCode", ex.getErrCode());
        model.addObject("errMsg", ex.getErrMsg());

        return model;

    }

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

        ModelAndView model = new ModelAndView("error/generic_error");
        model.addObject("errMsg", "this is Exception.class");

        return model;

    }

}

4. Страницы JSP

pages/index.jsp

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


    

Spring MVC @ExceptionHandler Example

${msg}

pages/error/generic_error.jsp

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



    
        

${errCode} : System Errors

System Errors

${errMsg}

5. тестирование

Просмотрите следующие 3 теста:

spring-exceptional-handle-result-normal

spring-exceptional-handle-result-error

spring-exceptional-handle-result-io-error

6. Пример @ControllerAdvice

Приведенный выше пример@ExceptionHandler применим только к одному контроллеру, чтобы применить его глобально (все контроллеры), аннотируйте класс с помощью@ControllerAdvice.

GlobalExceptionController.java

package com.example.web.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.example.web.exception.CustomGenericException;

@ControllerAdvice
public class GlobalExceptionController {

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

        ModelAndView model = new ModelAndView("error/generic_error");
        model.addObject("errCode", ex.getErrCode());
        model.addObject("errMsg", ex.getErrMsg());

        return model;

    }

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

        ModelAndView model = new ModelAndView("error/generic_error");
        model.addObject("errMsg", "this is Exception.class");

        return model;

    }

}

7. Скачать исходный код

Скачать -SpringMvc-ExceptionHandler-Example.zip (15 КБ)