2016-11-09 61 views
4

我使用一個春天(版本3.2.5)註釋驅動mvc應用程序,基本上我需要能夠捕捉任何錯誤的URL到一個單一的方法,然後顯示錯誤信息。例如,如果我的正確url www.url.valid/login映射到控制器,如果用戶錯誤地插入loginw或任何無效的url,它應映射到默認控制器。春天mvc - 如何映射所有錯誤的請求映射到一個單一的方法

我曾嘗試以下方法:

package com.controller; 

import static com.mns.utils.Constants.REGISTER_FAIL; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class DefaultSpringController { 

     @RequestMapping 
     public String forwardRequest(final HttpServletRequest request) { 
     return "redirect:/" + REGISTER_FAIL; 
     } 

} 

我的應用程序上下文如下:

<!-- Default to DefaultSpringController --> 
    <bean id="defaultSpringController" class="com.controller.DefaultSpringController"> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="defaultHandler" ref="defaultSpringController"/> 
    </bean 

但一直得到以下錯誤:

nested exception is java.lang.ClassNotFoundException: com.controller.DefaultSpringController 

我不知道我在這裏錯過了什麼,而控制器是在正確的包裝中。

任何想法我可以實現它嗎?

在此先感謝

回答

5

它看起來像,你想要一個全局頁面找不到處理程序。

@ControllerAdvice 
public class GlobalExceptionContoller { 

    @ExceptionHandler(NoHandlerFoundException.class) 
    public String handleError404(HttpServletRequest request, Exception e) { 
     return "pageNotFoundViewNameGoesHere"; 
    } 

} 
+0

請任何人做出downvote時發表評論。 –

+1

看起來像一些天真的SO用戶downvote:| –

+0

嗨看起來像版本3.2.5 NoHandlerFoundException不可用,我正在編譯錯誤 – user1999453

2

可以爲無效urlweb.xml設置配置。請注意,無效url通常會拋出404錯誤頁面。

<error-page> 
     <error-code>404</error-code> 
     <location>/error/error.jsp</location> 
    </error-page> 

如果還不夠,您可以從此錯誤頁面轉到您的控制器方法。但我通常使用此配置錯誤頁面,而不是服務器端代碼。有許多其他的替代方法取決於你的技術使用情況,但這種方式可以減少你的代碼。

0

如果定義ExceptionHandler,記住,像/login/blabla錯誤的請求不會拋出NoHandlerFoundException,因爲後綴模式數學activated by default

因此只是定義一個ExceptionHandler是不夠的,所以全部錯誤的請求。

在這種情況下執行以下步驟:

第一步。配置應用程序拋出一個異常,未映射的電話像/login/blablaSuffixPattern + TrailingSlashMatch):

@Configuration 
public class WebAppMainConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void configurePathMatch(PathMatchConfigurer configurer) { 
     // will throw NoHandlerFoundException 
     configurer.setUseSuffixPatternMatch(false); 
     configurer.setUseTrailingSlashMatch(false); 
    } 

    [...] 
} 

第二步。定義異常處理程序:

@ControllerAdvice 
public class GlobalExceptionHandler { 

    @ResponseStatus(value = HttpStatus.NOT_FOUND) 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public Object handleException(NoHandlerFoundException ex, HttpServletRequest request) { 
     [...] 
     ex.printStackTrace(); 
     return "error"; 
    } 

} 
+0

我希望downvoter能解釋他的downvote。所以我們可以學習 – dit