Exemple de gestion des exceptions MVC de printemps

Exemple de gestion des exceptions Spring MVC

Dans l'application Web J2EE / servlet, vous pouvez mapper la page d'erreur pour spécifier une exception comme celle-ci:

web.xml

  
    404
    /WEB-INF/pages/404.jsp
  

  
    com.example.web.exception.CustomException
    /WEB-INF/pages/error/custom_error.jsp
  

  
    java.lang.Exception
    /WEB-INF/pages/generic_error.jsp
  

Le code ci-dessus doit être auto-exploratoire. Si la fonction de gestion des exceptions existe dans le conteneur de servlet, pourquoi avons-nous encore besoin d'utiliser Spring pour gérer l'exception?

Généralement, il y a deux raisons:

  1. Customize Error Page - Le conteneur de servlet rendra directement la page d'erreur; Alors que Spring vous permet de renseigner le modèle ou les données sur la page d'erreur, vous pouvez donc personnaliser une page d'erreur plus conviviale.

  2. Business logic - Spring vous permet d'appliquer une logique métier supplémentaire avant de rendre la page d'erreur, comme la journalisation, l'audit, etc.

Dans ce didacticiel, nous allons vous montrer deux exemples pour gérer l'exception au printemps.

  1. Pour Spring 2.x, nous utilisonsSimpleMappingExceptionResolver dans le fichier XML.

  2. Pour Spring 3.x, nous pouvons simplifier la configuration XML via l'annotation@ExceptionHandler.

1. Exemple SimpleMappingExceptionResolver

Vérifiez la structure du répertoire.

spring-mvc-exception-example-directory

Une exception personnalisée.

CustomGenericException.java

package com.example.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;
    }

}

Cette classe de contrôleur, lancez simplement unCustomGenericException avec un code d'erreur personnalisé et une description de l'erreur.

CustomerController.java

package com.example.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.example.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");

  }

}

Vérifiez lesSimpleMappingExceptionResolver ci-dessous:

mvc-dispatcher-servlet.xml



    

    

    
    

    
      
        
            
                error/generic_error
            
            error/exception_error
        
      
    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

    

En haut, quand

  1. CustomGenericException est levée, elle sera mappée au nom de la vue "error / generic_error".

  2. Toute autre exception est levée, elle sera mappée au nom de la vue «error / exception_error».

Dans la page JSP, vous pouvez accéder à l'instance d'exception via${exception}.

pages/error/generic_error.jsp.jsp

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



    
        

${exception.errCode} : System Errors

System Errors

${exception.errMsg}

spring-mvc-exception-handle-1

2. Exemple @ExceptionHandler

Depuis Spring 3.0, il existe une nouvelle annotation@ExceptionHandler pour simplifier la configuration XML. Voici la version équivalente utilisant@ExceptionHandler.

CustomerController.java

package com.example.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.example.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;

    }

}

Rien à déclarer dans le fichier XML Spring.

mvc-dispatcher-servlet.xml



    

    
        
            /WEB-INF/pages/
        
        
            .jsp
        
    

    

Téléchargez-le -SpringMvc-ExceptionHandler-Example.zip (15 Ko)

Note
Vous pouvez vous intéresser à ceSpring MVC @ExceptionHandler Example