2012-03-28 14 views
14

Ich habe einen Spring MVC-Controller mit einigen einfachen REST-Serviceanforderungen. Ich möchte eine Fehlerbehandlung hinzufügen, wenn bestimmte Ausnahmen von meinen Diensten ausgelöst werden, aber ich kann keine mit @ExceptionHandler annotierte Handler-Methode erhalten, um tatsächlich jemals aufgerufen zu werden. Hier ist ein Service, den ich absichtlich eine Ausnahme ausspreche, um zu versuchen, meine Handlermethode zu übernehmen, um zu übernehmen. Die Handler-Methode wird nie aufgerufen, und Spring gibt nur einen 500-Fehler an den aufrufenden Client zurück. Hast du irgendwelche Ideen, was ich falsch mache?Spring MVC @ ExceptionHandler-Methode im Controller nie aufgerufen wird

@ExceptionHandler(IOException.class) 
public ModelAndView handleIOException(IOException ex, HttpServletRequest request, HttpServletResponse response) { 
    response.sendError(HttpServletResponse.SC_FORBIDDEN); 
    System.out.println("It worked!"); 
    return new ModelAndView(); 
} 

@RequestMapping(value = "/json/remove-service/{id}", method = RequestMethod.DELETE) 
public void remove(@PathVariable("id") Long id) throws IOException { 
    throw new IOException("The handler should take over from here!"); 
} 

Antwort

13

Diese tip on the Spring forum kann Ihnen helfen.

wahrscheinlich, dass Sie die Bohnen so konfiguriert haben, für Ihre DispatchServlet in einer webmvc-servlet.xml-Datei (* -servlet.xml Datei anders benannt werden kann)

Wenn die XML-Datei bereits eine andere ExceptionResolver enthält (wie SimpleMappingExceptionResovler Frühling so manuell die Anmerkung hinzugefügt werde nicht alle anderen Resolver für Sie automatisch hinzufügen Resolver wie folgt:..

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" /> 

Sollte ermöglichen die @HandlerException Verarbeitung

+3

'AnnotationMethodHandlerExceptionResolver' ist jetzt veraltet, dies hilft in neueren Versionen von Spring nicht. –

+0

Die Verwendung dieser Bean mit der Eigenschaft 'p: order', die auf die höchste Priorität (1) gesetzt wurde, hat mein Problem behoben. – Alex

+0

@MattFriedman Ersetzen Sie einfach 'AnnotationMethodHandlerExceptionResolver' durch' org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver' arbeitete für mich –

0

Es wird nicht funktionieren, weil, wenn Sie String zurückkehren zurückkehren Sie anzeigen Namen.

Jetzt sucht Ihr Spring MVC-Controller nach Diese Methode wird nie aufgerufen! Warum nicht?! anzeigen und finden können.

Stellen Sie sicher, dass @ExceptionHandler der vorhandenen Ansicht zugeordnet ist.

+0

Das würde höchstwahrscheinlich zu einem 404 führen, nicht zu einem 500. – skaffman

+1

Sorry, der Punkt ist, dass die Methode nie aufgerufen wird, was zurückgegeben wird, ist irrelevant. Ich habe geändert, was zurückgegeben wird. – 11101101b

12

Frustrierend habe ich auch darunter gelitten. Ich entdeckte, dass, wenn Sie irrtümlicherweise Throwable anstelle von Exception implementieren, der Exception-Resolver Ihre Throwable als IllegalStateException einfach erneut auslöst. Dies kann Ihre @ExceptionHandler nicht aufrufen.

Wenn Sie Throwable anstelle von Exception implementiert haben, versuchen Sie es stattdessen zu Exception zu ändern.

Hier ist der Code in Frage InvocableHandlerMethod

catch (InvocationTargetException e) { 
      // Unwrap for HandlerExceptionResolvers ... 
      Throwable targetException = e.getTargetException(); 
      if (targetException instanceof RuntimeException) { 
       throw (RuntimeException) targetException; 
      } 
      else if (targetException instanceof Error) { 
       throw (Error) targetException; 
      } 
      else if (targetException instanceof Exception) { 
       throw (Exception) targetException; 
      } 
      else { 
       String msg = getInvocationErrorMessage("Failed to invoke controller method", args); 
       throw new IllegalStateException(msg, targetException); 
      } 
     } 
4

ich gefunden habe, dass @ExceptionHandler Arbeiten mit Throwable, wenn Sie die Methode in einer solchen Weise zu definieren:

@ExceptionHandler(Throwable.class) 
@ResponseBody 
public String handleException(Throwable e) { 

} 

In diesem Fall Verfahren nur ein Argument hat vom Typ Throwable. Wenn ich versuche, in dieser Methode einige zusätzliche Parameter zu verwenden (ich habe versucht, Model zu verwenden), erhalte ich 500 Ausnahme (diese Methode ist kein Aufruf). Dies funktioniert jedoch immer noch, wenn zusätzliche Parameter HttpServlerRequest oder HttpServlerResponse sind.

Verwandte Themen