2010-11-19 6 views
15

Ich kann nicht herausfinden, wie mehr als eine Art von Ausnahme von @ExceptionHandler zu behandeln.Spring @ ExceptionHandler Umgang mit mehreren Arten von Ausnahmen

Ich muss programmgesteuert mit diesen Ausnahmen umgehen, dafür würde ich eine gemeinsame Referenz benötigen. Geht das über diesen Verweis "Ausnahme ex"? Ich denke nicht, denn die Ausnahme wird nicht so gefangen, wie würde ich es dann tun?

Ich kann nicht alle Ausnahme Referenzen als Argumente für die Handler-Methode, es wäre nicht sinnvoll, es kann nicht programmatisch behandelt werden. Ich brauche eine gemeinsame Referenz, so dass ich „instanceof“ darauf verwenden könnte oder es nur woanders als allgemeines „Exception“

@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"; 
    } 

Zusätzliche Frage senden: Was, wenn ich wollte zu handhaben org.springframework.web.multipart .MaxUploadSizeExceededException, die nicht von einer beliebigen Methode des Handlers ausgelöst wird? Weil @ExceptionHandler nur Ausnahmen abfängt, die von einer der Handler-Methoden ausgelöst werden.

Die Methode exceptionHandler kann in einen erweiterten übergeordneten Controller eingefügt werden, aber wenn nur defaultAnnotationHandlerMapping verwendet wird ...?

jede Hilfe dankbar, ich werde verrückt, das ist sehr frustrierend ....

Antwort

15

Der @ExceptionHandler Wert kann auf eine Reihe von Ausnahmetypen eingestellt werden. Wenn eine Ausnahme ausgelöst wird, die einem der Typen in der Liste entspricht, wird die mit dem entsprechenden @ExceptionHandler annotierte Methode aufgerufen. Wenn der Anmerkungswert nicht festgelegt ist, werden die als Methodenargumente aufgeführten Ausnahmetypen verwendet. Einzelheiten finden Sie unter documentation.

0

Ihre Frage ist eher verwirrend, aber Ihre Methode Exception-Handler wird nur eine Ausnahme zu einem Zeitpunkt behandeln. Es fängt nicht mehrere Ausnahmen ein und übergibt sie dann an Ihre handleFormException() -Methode. Wenn Sie diese Ausnahmetypen anders behandeln müssen, sollten Sie für jede eine Exception-Handler-Methode erstellen, ein Argument des spezifischen Exception-Typs für Ihre Methode angeben und dann die entsprechende Behandlung durchführen. Zum Beispiel:

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


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

// and so on... 

Bitte beachten Sie die Frühlings-Dokumentation für weitere Informationen:

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

+0

ich ihnen die gleiche Art und Weise zu handhaben will. Ich lege sie in sessionErrors und viewlayer und javascript behandelt sie dann anders. Was ich wissen wollte, war, ob die Probe von mir korrekt ist, weil die Methode handleFormException die Ausnahme eines der in der Annotation-Werteliste erwähnten Typen nicht abfängt ... – lisak

+0

Wenn ich eine Methode für einen Ausnahmetyp deklariere, dann it funktioniert ... es ist seltsam ... Übrigens, weißt du, wie man mit Ausnahmen umgeht, die außerhalb des Handlers geworfen werden? Ich meine mit diesem @ExceptionHandlers ... Als ich die zusätzliche Frage gestellt habe ... – lisak

17

Ich füge nur zu NimChimpsky Antwort "Der @ ExceptionHandler Wert kann auf ein Array von Exception-Typen festgelegt werden". Die Umsetzung des mit Ausnahme Array wie im Frühjahr erwähnte documentation wird wie

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

Verwandte Themen