2010-04-13 10 views
7

Miałem nadzieję zaimplementować jeden "ExceptionController" do obsługi wyjątków, które są zgłaszane podczas wykonywania moich innych metod kontrolerów. Nie określiłem żadnego HandlerExceptionResolver w moim kontekście aplikacji, więc zgodnie z API documentation należy uruchomić AnnotationMethodHandlerExceptionResolver. Zweryfikowałem go jako taki w źródle. Dlaczego więc następujące czynności nie działają?Problemy z implementacją wyjątku sterownika kontrolera 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(); 
    } 
} 

widzę w dziennikach debugowania że trzy domyślne koparki Wyjątkiem są zadawane do obsługi wyjątku, ale nic się nie dzieje i widzę „DispatcherServlet - Nie można ukończyć żądania”. Następnie użytkownik wyświetla komunikat stacktrace i błąd wewnętrzny 500.

Odpowiedz

6

Upewnij się, że procedura obsługi wyjątków zwraca widok, który istnieje/mapuje do programu obsługi.

+0

To wydawało się być problemem. – predhme

+2

@predhme, naprawiłam twój problem? Mam przykład podobny do twojego, a metoda @ExceptionHandler jest wywoływana tylko wtedy, gdy wyjątek jest generowany z tego samego kontrolera. – curthipster

+1

Zauważyłem to również później. Sądzę, że najważniejszą rzeczą było dla mnie skonfigurowanie strony 500 i 404, tak, że jeśli czegoś nie złapałem, użytkownik nie otrzymał śladu stosu. – predhme

1

Nie sądzę, że to dobry projekt. Kontrolery na wiosnę obsługują żądania HTTP i mapują na adresy URL. Nie uważam, że "wyjątek" pasuje do obu pojemników. Wydaje mi się, że nie używam wiosny.

Wyjątek nie jest żądaniem HTTP. Nie mapujesz wyjątku do adresu URL. W związku z tym stwierdziłbym, że kontrolerzy nie mają być traktowane jako procedury obsługi wyjątków.

Kontrolery to część Spring API, ale Twój projekt nie używa ich zgodnie z przeznaczeniem, dlatego nie działa. Ponownie przemyśl swój projekt.

+1

Oprócz API sprężynowego. Nie jestem pewien, czy rozumiem, dlaczego wtedy byłoby to niewłaściwe. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme

4

Powinieneś napisać swój wyjątkowy uchwyt do tej samej klasy, z którą chcesz obsługiwać, jak na przykład.

@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(); 
    } 
} 
Powiązane problemy