2010-04-13 8 views
7

Speravo di implementare un singolo "ExceptionController" per gestire le eccezioni generate nell'esecuzione dei metodi dei miei altri controller. Non avevo specificato alcun HandlerExceptionResolver nel mio contesto applicativo, quindi in base allo API documentation è necessario avviare AnnotationMethodHandlerExceptionResolver. L'ho verificato come tale nella fonte. Quindi perché il seguente lavoro non funziona?Problemi di implementazione del gestore di eccezioni del controller Spring 3

@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(); 
    } 
} 

vedo nei registri di debug che i tre gestori di eccezioni predefinite sono chiesto per la movimentazione di eccezione, ma non si fa nulla e vedo "DispatcherServlet - non poteva completa richiesta". Seguito dall'utente che viene visualizzato lo stacktrace e un errore interno 500.

risposta

6

Assicurarsi che il gestore di eccezioni restituisca una vista esistente/mappata a un gestore.

+0

Questo sembrava essere il problema. – predhme

+2

@predhme, ha davvero risolto il tuo problema? Ho un esempio proprio come il tuo, e il metodo @ExceptionHandler viene invocato solo quando l'eccezione viene lanciata dallo stesso controller. – curthipster

+1

L'ho notato anche in seguito. Immagino che la cosa più importante fosse che io avessi impostato una pagina da 500 e 404 in modo che se non ci fosse qualcosa che non ho catturato, l'utente non è stato presentato con una traccia di stack. – predhme

1

Non penso che questo sia un buon progetto. I controllori in primavera gestiscono le richieste HTTP e si collegano agli URL. Non credo che "eccezione" si adatti a entrambi i bin. Mi sembra un cattivo uso di Spring.

Un'eccezione non è una richiesta HTTP. Non si esegue il mapping di un'eccezione a un URL. Quindi concluderei che i controllori non sono destinati a essere trattati come gestori di eccezioni.

I controller sono una parte dell'API Spring, ma il tuo progetto non li sta utilizzando come previsto, ecco perché non funziona. Rifletti sul tuo design.

+1

È parte dell'API primaverile. Non sono sicuro di aver capito perché sarebbe stato un cattivo uso allora. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme

4

Si dovrebbe scrivere il proprio gestore di eccezioni nella stessa classe con cui si desidera gestire, come nel seguito.

@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(); 
    } 
} 
Problemi correlati