2012-03-28 29 views
14

Bazı basit REST servis isteklerine sahip bir Spring MVC denetleyicim var. Özel istisnalar hizmetlerimden atıldığında bazı hata işleme eklemek istiyorum, ancak aslında hiç çağrılmak üzere @ExceptionHandler ile açıklamalı bir işleyici yöntemi alamıyorum. Burada bir hizmet kasıtlı olarak devralmak için benim için bir istisna atayım. İşleyici yöntemi hiçbir zaman çağrılmaz ve Bahar, arayan istemciye 500 hata döndürür. Neyi yanlış yaptığım hakkında bir fikrin var mı?Spring MVC @ExceptionHandler yöntemi denetleyicide hiç çağrılmadı

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

cevap

13

Bu tip on the Spring forum size yardımcı olabilir. XML dosyası zaten başka ExceptionResolver (gibi SimpleMappingExceptionResovler Bahar içeriyorsa size (* -servlet.xml dosya adı farklı olabilir) bir webmvc-servlet.xml dosyasında DispatchServlet

için fasulye yapılandırmış

Olasılıkla . otomatikman Yani manuel şöyle açıklama çözümleyicinizi ekleyerek sizin için başka çözücüler eklemek alışkanlık.

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

@HandlerException işlenmesini sağlayacak mı

+3

'AnnotationMethodHandlerExceptionResolver' artık kullanımdan kaldırılmıştır, bu nedenle bu, Spring'in daha yeni sürümlerinde yardımcı olmaz. –

+0

Bu fasulyeyi 'p: order' özelliği ile kullanmak en büyük önceliğe ayarlandı (1) sorunumu gidermeyi başardı. – Alex

+0

@MattFriedman Sadece 'AnnotationMethodHandlerExceptionResolver' yerine org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver' benim için çalıştı –

0

İşe yaramaz, çünkü String döndüğünüzde, View name (Geri dön) adını döndürürsünüz.

Artık Spring MVC denetleyiciniz arıyor Bu yöntem hiçbir zaman çağrılmıyor! Neden olmasın?! görmek ve bulabilirsiniz.

@ExceptionHandler'un varolan görünüme eşlendiğinden emin olun.

+0

Bu büyük olasılıkla bir 404'e neden olur, bir 500. – skaffman

+1

Üzgünüz, buradaki nokta, yöntemin hiçbir zaman çağrılmamasıdır, bu yüzden döndürülen şey alakasızdır. Ne iade edildiğini değiştirdim. – 11101101b

12

Sinirsizce, bundan da acı çektim. Exception yerine Throwable yanlış uygularsanız, Özel Durum çözümleyicisi yalnızca Throwable'nuzu IllegalStateException olarak yeniden atar. Bu, @ExceptionHandler numaralı telefonunuzu çağırmaya başarısız olur.

Exception yerine Throwable uyguladıysanız, bunu yerine Exception olarak değiştirmeyi deneyin. İşte

Throwable ile @ExceptionHandler çalışır böyle bir şekilde yöntemini tanımlarken ben bulduk 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

gelen söz konusu kod: Bu durumda yöntemde

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

} 

sadece bir argüman vardır Throwable türünde. Bu yöntemde kullanmayı denediğim bazı ek parametreler (Model'i kullanmaya çalıştım), 500 istisna aldım (bu yöntem çağrı değil). Ancak bu, ek parametreler HttpServlerRequest veya HttpServlerResponse olduğunda hala çalışır.

İlgili konular