2010-11-19 3 views
15

Je n'arrive pas à comprendre comment gérer plus d'un type d'exception avec @ExceptionHandler.Spring @ExceptionHandler gérant plusieurs types d'exceptions

Je dois gérer par programme ces exceptions, pour cela, j'ai besoin d'une référence partagée. Est-ce fait via cette référence "Exception ex"? Je ne pense pas, parce que l'exception n'est pas attrapée comme ça, comment le ferais-je alors?

Je ne peux pas mettre toutes les références d'exception en tant qu'arguments à la méthode du gestionnaire, cela n'aurait aucun sens, il ne peut pas être traité par programme. Je besoin d'une référence commune pour que je puisse utiliser « instanceof » sur elle ou tout simplement l'envoyer ailleurs comme une « exception » générale

@ExceptionHandler({DescriptionCstOrderException.class, SpecializationCstOrderException.class, NoUploadFileException.class, 
        DeadLineCstOrderException.class, DocumentCstOrderException.class, CommentCstOrderException.class}) 
public String handleFormException(Exception ex, ActionRequest actionRequest) { 
    logger.error(ex.getMessage()); 
    SessionErrors.add(actionRequest, ex.getClass().getName()); 
    return "mainOrderForm"; 
    } 

question supplémentaire: si je voulais gérer org.springframework.web.multipart .MaxUploadSizeExceededException, qui n'est pas levée à partir de n'importe quelle méthode du gestionnaire? Parce que @ExceptionHandler attrape seulement les exceptions qui sont lancées à partir de l'une des méthodes du gestionnaire.

La méthode exceptionHandler peut être placée dans un contrôleur parent étendu, mais si on utilise uniquement defaultAnnotationHandlerMapping ...?

apprécierais toute aide, je deviens fou, ce qui est très frustrant ....

Répondre

15

La valeur @ExceptionHandler peut être définie par un tableau de types d'exception. Si une exception est renvoyée correspond à l'un des types dans la liste, la méthode annotée avec le @ExceptionHandler correspondant sera appelée. Si la valeur de l'annotation n'est pas définie, les types d'exception répertoriés comme arguments de méthode sont utilisés. Voir le documentation pour plus de détails.

0

Votre question est assez déroutant, mais votre méthode de gestionnaire d'exceptions ne gérer qu'une seule exception à la fois. Il n'attrape pas plusieurs exceptions, puis les passe toutes les deux dans votre méthode handleFormException(). Si vous devez gérer ces types d'exception différemment, vous devez créer une méthode de gestionnaire d'exceptions pour chacun d'eux, spécifier un argument de ce type Exception spécifique à votre méthode, puis effectuer la gestion appropriée. Par exemple:

@ExceptionHandler(DescriptionCstOrderException.class) 
public String handleDescriptionCstOrderException(DescriptionCstOrderException exception, ActionRequest actionRequest) {...} 


@ExceptionHandler(SpecializationCstOrderException.class) 
public String handleSpecializationCstOrderException(SpecializationCstOrderException exception, ActionRequest actionRequest) {...} 

// and so on... 

S'il vous plaît se référer à la documentation de printemps pour plus d'informations:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-exceptionhandler

+0

Je ne veux les traiter de la même manière. Je les ai mis dans sessionErrors et viewlayer et javascript les traite différemment alors. Ce que je voulais savoir, c'est si l'exemple de mien est correct, car la méthode handleFormException n'attrape pas l'exception de l'un des types mentionnés dans la liste des valeurs d'annotation ... – lisak

+0

si je déclare une méthode pour un type d'exception, fonctionne ... c'est bizarre ... Btw, savez-vous comment gérer les exceptions qui sont lancées en dehors du gestionnaire? Je veux dire en utilisant ce @ExceptionHandlers ... Comme je l'ai demandé à la question supplémentaire ... – lisak

17

Je viens d'ajouter à la réponse NimChimpsky "La valeur @ExceptionHandler peut être définie sur un tableau de types d'exceptions". La mise en œuvre de l'utilisation de tableau d'exception comme mentionné au printemps documentation sera comme

@ExceptionHandler({NotFoundException.class,MissingServletRequestParameterException.class})

Questions connexes