2012-12-12 29 views
0

在我們的服務器上我們有一個通用的servlet映射配置上看未發現異常,顯示404

<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

的問題是,不是每個*。做URL在控制器配置,因此調用與結尾的網址*不存在。做而同樣unexisting網址不是結尾產生一個500錯誤*。做那麼返回的404

我想要做的就是配置的DispatcherServlet返回對案件404或至少趕上那些例外並返還404.

回答

0

超出配置請在您的部署描述符中響應​​元素以明確捕獲404錯誤,或者您沒有任何其他選項。如果您使用的是完整的Web應用程序容器(如glassfish),則可以在容器級別覆蓋404頁面。看看here爲您的選擇按配置(沒有使用Servlet 3.0的新選項)

請注意,有沒有在JavaEE的堆棧ViewNotFoundException這樣的事情(我檢查是絕對可靠),因爲容器跳躍和在第一個提示取得控制權時,某種東西可能根本錯誤,因爲它能夠爲請求的資源提供服務

4XX系列狀態碼通常不在控制之列,因爲它們描述的錯誤條件很可能無法處理401-forbidden404-Not found等)或不應該處理,有點像java的運行時異常。

1

在控制器類中添加上述方法。每一個將拋出的異常,即使是RuntimeException,它們都會被這個方法所捕獲。

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
@ExceptionHandler(Exception.class) 
public ModelAndView handleException(Exception ex) { 
    Logger.getLogger(GuestNavController.class).error(ex); 
    ModelAndView modelAndView = initializeModelAndView("guest/error500"); 

    return modelAndView; 
} 

很明顯,如果你改變了@ExceptionHandler例外參數和方法的參數(他們必須是相同的),你將能夠趕上一個特定的異常。

如果您有多個控制器類,您應該創建一個控制器建議。您可以在源代碼中添加上面的類。

@ControllerAdvice 
public class ExceptionManager { 
    private final Logger logger = Logger.getLogger(ExceptionManager.class); 

    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public ModelAndView handleError404(Exception ex) { 
     logger.error("ERROR 404: " + ex.getMessage()); 

     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("guest/error404"); 
     return modelAndView; 
    } 
} 

您可以在此類中添加多個方法。這個方法將捕獲拋出的每個異常。
請小心,萬一您已經包含上述解決方案。如果在包含具有@ExceptionHandler批註的方法的控制器中引發異常,則該異常將僅由此方法捕獲,而不是由外部類捕獲。外部類(解決方案2)將捕獲內部方法未捕獲的異常(解決方案1)。