2010-11-19 19 views
15

Nie mogę dowiedzieć się, jak obsługiwać więcej niż jeden rodzaj wyjątku przez @ExceptionHandler.Spring @ExceptionHandler obsługa wielu rodzajów wyjątków

Potrzebuję programowo radzić sobie z tymi wyjątkami, do tego będę potrzebował wspólnego odniesienia. Czy odbywa się to poprzez odniesienie "Exception ex"? Nie sądzę, ponieważ wyjątek nie został złapany w ten sposób, jak miałbym to zrobić?

Nie mogę umieścić wszystkich odwołań do wyjątków jako argumentów w metodzie programu obsługi, nie ma to sensu, nie można go programowo obsłużyć. Muszę udostępnionego odniesienia tak, że mogę użyć „instancją” na nim lub po prostu wysłać go gdzieś indziej jako ogólne „wyjątek”

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

dodatkowe pytanie: co jeśli chcę obsłużyć org.springframework.web.multipart .MaxUploadSizeExceededException, który nie jest generowany z żadnej metody obsługi? Ponieważ @ExceptionHandler przechwytuje tylko wyjątki, które są wyrzucane z jednej z metod obsługi.

Metoda exceptionHandler może zostać umieszczona w rozszerzonym kontrolerze nadrzędnym, ale jeśli używa się tylko domyślnegoAnnotationHandlerMapping ...?

wdzięczni za każdą pomoc, mam zamiar szalony, to jest bardzo frustrujące ....

Odpowiedz

15

Wartość @ExceptionHandler można ustawić tablicę typów wyjątku. Jeśli zgłoszony wyjątek pasuje do jednego z typów na liście, wówczas zostanie wywołana metoda opatrzona adnotacją pasującego @ExceptionHandler. Jeśli wartość adnotacji nie jest ustawiona, używane są typy wyjątków wymienione jako argumenty metody. Szczegółowe informacje znajdują się w documentation.

0

Twoje pytanie jest dość kłopotliwe, ale metoda obsługi wyjątku będzie obsługiwać tylko jeden wyjątek naraz. Nie przechwyci wielu wyjątków, a następnie przekaże je do swojej metody handleFormException(). Jeśli chcesz inaczej obsłużyć te typy wyjątków, powinieneś dla każdego z nich utworzyć metodę obsługi wyjątku, określić argument tego konkretnego typu wyjątku dla swojej metody, a następnie wykonać odpowiednią obsługę. Na przykład:

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


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

// and so on... 

Proszę zapoznać się z dokumentacją wiosennym celu uzyskania dalszych informacji:

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

+0

chcę obsłużyć je w ten sam sposób. Wrzucam je do sessionErrors i viewlayer, a javascript obsługuje je wtedy inaczej. Chciałem się dowiedzieć, czy moja próbka jest poprawna, ponieważ metoda handleFormException nie przechwytuje wyjątku jednego z typów wymienionych na liście wartości adnotacji ... – lisak

+0

jeśli deklaruję jedną metodę dla jednego typu wyjątku, to działa ... to dziwne ... Btw, czy wiesz, jak radzić sobie z wyjątkami, które są wyrzucane poza handler? Mam na myśli używanie tego @ExceptionHandlers ... Kiedy zadałem dodatkowe pytanie ... – lisak

17

Dodaję tylko odpowiedź NimChimpsky "Wartość @ExceptionHandler można ustawić na tablicę typów wyjątków". Realizacja z wykorzystaniem tablicy wyjątków jak wspomniano na wiosnę documentation będzie jak

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