2012-11-21 20 views
7

Czy chciałbyś zadać pytanie dotyczące najlepszej praktyki, w którym mowa jest o kontrolerze wiosna-mvc. Zapoznaj się z poniższym kodem:Sterowanie spring-mvc i obsługa wyjątków

@Autowired 
    SomeService service; 

    @RequestMapping (...) 
    public @ResponseBody Response createSomething() { 

     try { 

      serviceResponse = service.doSomething(); 

      //create a success response and return 

     } 
     catch (SomeServiceException e) { 
      //create an error response and return 
     } 

} 

Czy obsługa błędów ma się odbywać na poziomie normalnego kontrolera? A może klasa usług nie powinna rzucać wyjątków, jak pokazano powyżej. Proszę przejrzeć i dać mi znać.

Odpowiedz

7

Powiedziałbym, że masz trzy strategie w zależności od przypadku użycia.

Istnieją mniej więcej trzy strategie: HandlerExceptionResolver, @ExceptionHandler i obsługa wyjątków wewnętrznie w ramach działania.

Przypadki użycia są następujące: typowa procedura obsługi wyjątku dla całej aplikacji, cały kontroler, odpowiednio określone działanie.

+0

wszystkie te programy obsługi są powiązane tylko ze Spring MVC dobrze ? Mam na myśli, czy mogę obsłużyć dowolny nieoczekiwany wyjątek z filtru lub poza zasięgiem kontrolera? Ponieważ, jak na dokument, jest napisane, że implementacje _Spring 'HandlerExceptionResolver' radzą sobie z nieoczekiwanymi wyjątkami, które występują podczas wykonywania kontrolera_ **, tj. podczas wykonywania sterownika ** – agpt

+0

Używam Spring Boot z chmurą Spring, gdzie odbywa się inteligentne trasowanie. stąd nie ma w tym przypadku Spring MVC. Jaki może być najlepszy sposób na obsługę wyjątków na poziomie globalnym? Rozwiązanie oparte na AOP? – agpt

1

Klasa serwisowa może/powinna rzucić wyjątek. Można obsługiwać te wyjątki w kontrolerze w celu rejestrowania celów. Można również wyświetlać odpowiednie strony błędów na podstawie wyjątku złapanego na kontrolerze, ale będzie to żmudne. spróbujmy obsługiwać wyjątki wiosenne .. http: //www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

+0

Rajesh: Nie zwracam widoku z tego kontrolera. Zwracam json/ResponseBody, dlatego nie mam strony błędu do wyświetlenia. Jednak podoba mi się twoja sugestia użycia @ExceptionHandler zamiast wykonywania bloków try i catch. Czy to będzie działało? Dziękuję i dziękuję za odpowiedź. – Khush

+0

Khush ... albo możesz wychwycić wyjątek w kontrolerze i wysłać odpowiedni błąd msg jako wynik json i pokazać, że odpowiednio na ekranie ... to jest zrobione w niewielkim przypadku .. ale również wprowadzić ten wyjątek handler, aw przypadku ajax u get errorpage.html jako odpowiedź ajax..możesz następnie aktualizować tę stronę na div lub iframe na ekranie .. jeśli chcesz odpowiedzieć głosuj tak, żebym mógł zdobyć punkty :) – Rajesh

2

Powiedziałbym, że najlepszą praktyką byłoby użycie @ExceptionHandler. Ponieważ wadą obsługi wyjątku w metodzie sterownika jest to, że kod jest mniej czytelny i może być powtarzany w wielu metodach kontrolera.

Polecam posiadanie klasy bazowej dla kontrolerów z zdefiniowanym @ExceptionHandler. W ten sposób można go używać do wielu różnych kontrolerów, bez kopiowania kodu. Byłoby to bardziej czytelne niż podejście oparte na wyjątku wyjątku, ale może być używane w połączeniu.

0

Zdefiniuj plik definicji fasoli w pliku bean dla klasy Handler. gdy wyjątek jest zgłaszany w programie, wywoływana jest metoda resolveException.

public class Handler 
     implements HandlerExceptionResolver 
    { 

     public Handler() 
     { 
     } 

     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
     { 
      if(ex instanceof ErrorType1Exception)) 
      { 
       ModelAndView test = new ModelAndView("errorpage1jsppage"); 
return test; 
      } else 
      if(ex instanceof ErrorType2Exception)) 
      { 
       ModelAndView test1 = new ModelAndView("errorpage2jsppage"); 
return test1 
      } 
     } 
    }