2015-04-02 145 views
1

我有下面一塊異常處理程序,當找不到資源時重定向到「notfound」頁面。但是,在Apache日誌中,我沒有看到404錯誤代碼。有沒有辦法得到這個異常處理程序拋出的404錯誤?扔404並重定向到春季的自定義錯誤頁面

@ExceptionHandler(UnknownIdentifierException.class) 
public String handleUnknownIdentifierException(final UnknownIdentifierException e, final HttpServletRequest request) 
{ 
    request.setAttribute("message", e.getMessage()); 
    return "forward:notfoundpage"; 
} 

回答

0

最好不要重定向到錯誤頁面,而只是顯示錯誤消息並設置錯誤的HTTP狀態碼。您可以通過在控制器處理程序方法中拋出異常來執行此操作。

你需要做那麼一類把它(儘管也許你已經用你的UnknownIdentifierException做到了這一點):

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class ResourceNotFoundException extends RuntimeException {} 

在你的控制器處理方法:

throw new ResourceNotFoundException(); 

要設置頁面在web.xml中顯示一個異常:

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/views/errors/404.jsp</location> 
</error-page> 
1

是:

@ExceptionHandler(UnknownIdentifierException.class) 
public String handleUnknownIdentifierException(final UnknownIdentifierException e, final HttpServletRequest request, final HttpServletResponse response) 
{ response.setStatus(404); 
    request.setAttribute("message", e.getMessage()); 
    return "forward:notfoundpage"; 
} 

另一種方式是標記有特殊標註的例外:

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order") // 404 
    public class UnknownIdentifierException extends RuntimeException { 
     // ... 
    } 

還有一個方法是在處理程序本身指定註釋錯誤代碼:

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Data integrity violation") 
@ExceptionHandler(UnknownIdentifierException.class) 
public String handleUnknownIdentifierException(final UnknownIdentifierException e, final HttpServletRequest request) 
{ 
/// 

這裏是長博客文章的主題:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

+0

謝謝。但是,下一行不會重定向覆蓋我們剛剛設置的404? – hop 2015-04-02 19:39:33

+0

如果它將重定向 - 是的,但這裏是轉發http://stackoverflow.com/questions/18671463/why-do-we-use-redirect-in-spring-mvc – 2015-04-02 19:44:35

+0

對不起亞歷克斯。我的意思是前進。所以當我們使用forward時,它不會改變HTTP代碼,它仍然會保持404? – hop 2015-04-02 21:22:45