2012-11-21 23 views
7

Ich möchte Sie eine Best-Practice-Frage stellen, wo ein Feder-Mvc-Controller betroffen ist. Bitte lesen Sie den folgenden Code:Spring-mvc-Controller und Ausnahmebehandlung

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

} 

Ist der Fehler auf Controller-Ebene üblich durchgeführt werden Handhabung? Oder sollte die Serviceklasse keine Ausnahmen wie oben gezeigt auslösen. Bitte überprüfen Sie und lassen Sie es mich wissen.

Antwort

7

Ich würde sagen, Sie haben drei Strategien je nach Anwendungsfall.

Es gibt ungefähr drei Strategien: HandlerExceptionResolver, @ExceptionHandler und die Behandlung von Ausnahmen intern innerhalb der Aktion.

Die Anwendungsfälle für diese sind: gemeinsame Ausnahme Handler für die ganze Anwendung, ganze Controller, spezifische Aktion entsprechend.

+0

all diese Handler sind nur Spring MVC zugeordnet Recht ? Ich meine, kann ich jede unerwartete Ausnahme von Filter oder außerhalb des Bereichs Controller behandeln? Weil laut Dokument es _Spring 'HandlerExceptionResolver'-Implementierungen mit unerwarteten Ausnahmen handelt, die während der Controller-Ausführung auftreten **. während der Controller-Ausführung ** – agpt

+0

Ich benutze Spring Boot mit Spring Cloud, wo intelligentes Routing stattfindet. daher keine Spring MVC beteiligt. Was könnte der beste Weg sein, um Ausnahmen auf globaler Ebene zu behandeln? AOP-basierte Lösung? – agpt

1

Service Klasse kann/sollte Ausnahme auslösen .. Sie können diese Ausnahme im Controller für die Protokollierung Zweck ... auch können Sie entsprechende Fehlerseiten auf der Grundlage der Ausnahme auf Controller gefangen..aber das wird langweilig sein .. besser versuchen Sie, die Ausnahmeregelung von Frühling ... http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

+0

Rajesh: Ich gebe keine Ansicht von diesem Controller zurück. Ich gebe ein json/ResponseBody zurück, daher habe ich keine Fehlerseite zur Anzeige. Ich mag jedoch Ihren Vorschlag, @ExceptionHandler zu verwenden, anstatt Blöcke zu versuchen und zu fangen. Wird es funktionieren? Danke und schätze Ihre Antwort. – Khush

+0

Khush..ein können Sie Ausnahme im Controller abfangen und entsprechende Fehler msg als Json Ergebnis senden und zeigen, dass entsprechend auf dem Bildschirm..dies ist in einigen kleineren Fall..aber auch diese Ausnahme-Handler einzuführen und im Falle von Ajax werden Sie get errorpage.html als Ajax Antwort .. Sie können dann diese Seite auf einem div oder iframe auf dem Bildschirm aktualisieren .. Wenn Sie die Antwort mögen, so dass ich einige Punkte bekommen kann :) – Rajesh

2

Ich würde sagen, die beste Praxis wäre, @ExceptionHandler zu verwenden. Als Nachteil bei der Behandlung der Ausnahme in der Controller-Methode ist, dass sie den Code weniger lesbar macht und möglicherweise über viele Controller-Methoden hinweg wiederholt wird.

Ich würde empfehlen, eine Basisklasse für Ihre Controller mit dem @ExceptionHandler definiert zu haben. Auf diese Weise kann es für viele verschiedene Controller ohne Code-Duplizierung verwendet werden. Dies wäre besser lesbar als der Ansatz des Exception Resolvers, könnte aber in Verbindung verwendet werden.

0

Definieren Sie die Bean in der Bean-Definitionsdatei für die Handler-Klasse. Wenn eine Ausnahme in einem Programm ausgelöst wird, wird die resolveException-Methode aufgerufen.

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 
      } 
     } 
    }