2010-04-13 71 views
7

我希望實現一個「ExceptionController」來處理執行其他控制器方法時拋出的異常。我沒有在我的應用程序上下文中指定任何HandlerExceptionResolver,所以根據API documentation AnnotationMethodHandlerExceptionResolver應該啓動。我在來源中證實了這一點。那麼,爲什麼以下工作?Spring 3控制器異常處理程序實現問題

@Controller 
public class ExceptionController { 

    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
    // Do some stuff 
    log.error(logging stuff) 
    return myModelAndView; 
    } 
} 

@Controller 
public class AnotherController { 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
    throw new NullPointerException(); 
    } 
} 

我看到了三個默認的異常處理程序要求異常處理的調試日誌,但什麼都不做,我看「的DispatcherServlet - 無法完成請求」。隨後出現用戶正在顯示堆棧跟蹤和500內部錯誤。

回答

6

確保您的異常處理程序正在返回存在的視圖/映射到處理程序。

+0

這似乎是問題所在。 – predhme 2010-04-14 12:36:48

+2

@predhme,那真的能解決你的問題嗎?我有一個和你一樣的例子,只有當異常從同一個控制器拋出時,纔會調用@ExceptionHandler方法。 – curthipster 2010-04-30 05:44:56

+1

我後來也注意到了。我想最重要的是我要設置一個500頁和404頁,這樣如果有什麼我沒有抓到的,用戶就不會看到堆棧跟蹤。 – predhme 2010-04-30 13:42:45

1

我不認爲這是一個很好的設計。 Spring中的控制器處理HTTP請求並映射到URL。我不認爲「例外」適合任何一個箱子。這感覺像是對我的春天的濫用。

異常不是HTTP請求。您不會將例外映射到URL。因此我得出結論,控制器不打算被視爲異常處理程序。

控制器是Spring API的一部分,但您的設計並未按預期使用它們,所以這就是爲什麼它不起作用。重新考慮你的設計。

+1

它是彈簧API的一部分。不知道我明白爲什麼它會被誤用。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme 2010-04-13 22:32:06

4

您應該將異常處理程序寫入您想要處理的同一個類,如下所示。

@Controller 
public class AnotherController { 
    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
     // Do some stuff. 
     log.error(logging stuff) 
     return myModelAndView; 
    } 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
     throw new NullPointerException(); 
    } 
}