2010-04-13 5 views
7

Ich hatte gehofft, einen einzelnen "ExceptionController" zu implementieren, um Ausnahmen zu behandeln, die in der Ausführung der Methoden meiner anderen Controller ausgelöst werden. Ich habe in meinem Anwendungskontext keinen HandlerExceptionResolver angegeben, daher sollte der AnnotationMethodHandlerExceptionResolver gemäß der API documentation gestartet werden. Ich habe es als solches in der Quelle verifiziert. Warum funktioniert das nicht?Spring 3 Controller Exception Handler Implementierungsprobleme

@Controller 
public class ExceptionController { 

    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
    // Do some stuff 
    log.error(logging stuff) 
    return myModelAndView; 
    } 
} 

@Controller 
public class AnotherController { 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
    throw new NullPointerException(); 
    } 
} 

Ich sehe in den Debug-Protokolle, die die drei Standard-Exception-Handler für den Umgang mit der Ausnahme gefragt werden, aber nichts getan wird, und ich sehe „DispatcherServlet - Anfrage konnte nicht abgeschlossen“. Gefolgt von dem Benutzer wird der Stacktrace und ein 500 Interner Fehler angezeigt.

Antwort

6

Stellen Sie sicher, dass Ihr Exception-Handler eine Ansicht zurückgibt, die einem Handler zugeordnet ist.

+0

Das schien das Problem zu sein. – predhme

+2

@predhme, hat das dein Problem wirklich behoben? Ich habe ein Beispiel genau wie Ihres, und die @ExceptionHandler-Methode wird nur aufgerufen, wenn die Ausnahme vom selben Controller ausgelöst wird. – curthipster

+1

Das habe ich später auch bemerkt. Ich denke, das Wichtigste war für mich, 500 und 404 Seiten einzurichten, so dass, wenn es etwas gab, das ich nicht erwischte, dem Benutzer keine Stack-Trace angezeigt wurde. – predhme

1

Ich denke nicht, dass dies ein gutes Design ist. Controller in Spring verarbeiten HTTP-Anforderungen und ordnen sie URLs zu. Ich denke nicht, dass "Ausnahme" in beide Fächer passt. Es fühlt sich für mich wie ein Missbrauch des Frühlings an.

Eine Ausnahme ist keine HTTP-Anfrage. Sie ordnen einer URL keine Ausnahme zu. Daher würde ich zu dem Schluss kommen, dass Controller nicht als Ausnahme-Handler behandelt werden sollen.

Controller sind ein Teil der Spring API, aber Ihr Design verwendet sie nicht wie vorgesehen, deshalb funktioniert es nicht. Überdenken Sie Ihr Design.

+1

Es ist abgesehen von der Feder API. Nicht sicher, ich verstehe, warum das dann Missbrauch wäre. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme

4

Sie sollten Ihren Exceptionhandler in dieselbe Klasse schreiben, mit der Sie arbeiten möchten, wie folgt.

@Controller 
public class AnotherController { 
    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
     // Do some stuff. 
     log.error(logging stuff) 
     return myModelAndView; 
    } 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
     throw new NullPointerException(); 
    } 
} 
Verwandte Themen