2016-04-16 65 views
0

無論何時用戶在瀏覽器中輸入錯誤的url,它將導致NoSuchRequestHandlingMethodException我想返回一個自定義視圖,而不是Spring提供消息的默認視圖。我有@AdviceController其中我試圖通過@ExceptionHAndler(NoSuchRequestHandlingMethodException.class)趕上它,並返回一個視圖,但它沒有奏效。我也繼承了DefaultHandlerExceptionResolver,並且提出了處理NoSuchRequestHandlingMethodException的方法,這也沒有奏效。我也嘗試通過擴展SimpleMappingExceptionResolversetExecptionMapping(在相同的@AdviceController類中)方法註冊視圖名稱以避免異常。我不知道我做錯了什麼。我什至對春天拋出NoSuchRequestHandlingMethodException當它沒有在控制器中找到任何映射有人可以告訴我如何返回與HTTP錯誤代碼相匹配的Spring異常的自定義視圖。在Spring MVC中返回NoSuchRequestHandlingMethodException的404錯誤的自定義視圖

這是我@ControllerAdvice

@ControllerAdvice 
public class ExceptionHandlerController extends  
DefaultHandlerExceptionResolver { 

@ExceptionHandler(NoSuchRequestHandlingMethodException.class) 
public String handleException(NoSuchRequestHandlingMethodException.class, Model model) { 

    String error = th.getMessage(); 
    model.addAttribute("error", error); 
    model.addAttribute(new User()); 
    return "login"; 
    } 

@override 
protected ModelAndView handleNoSuchRequestHandlingMethodException 
(NoSuchRequestHandlingMethodException ex, HttpServletRequest request, 
HttpServletResponse response, Object handler) throws Exception { 

     ModelAndView mav = new ModelAndView("notfound"); 
     return mav; 
    } 
} 

UPDATE:解決方案

NoSuchRequestHandlingMethodException沒有引起人們的關注,是因爲調度Servlet的委託請求默認的servlet處理程序(在我的情況DefaultServletHttpRequestHandler)和認爲它處理。我已經實現的解決方法是,我創建了一個映射'/ *'的處理程序方法,當沒有在任何控制器中找到特定的映射並且我通過新的NoSuchRequestHandlingMethodException可以在@ExceptionHandler中捕獲,然後返回自定義視圖。但是,我不知道處理這種異常的缺點。如果有的話讓我知道。

@Controller 
public class HomeController { 

... 

@RequestMapping(value = "/*", method = RequestMethod.GET) 
public void handleAtLast(HttpServletRequest request) throws NoSuchRequestHandlingMethodException { 
    throw new NoSuchRequestHandlingMethodException(request); 
    } 
} 

ExceptionHandlerController.java

@ControllerAdvice 
public class ExceptionHandlerController extends DefaultHandlerExceptionResolver { 
    @ExceptionHandler(NoSuchRequestHandlingMethodException.class) 
    public String handleNoSuchMethodtFoundException(NoSuchRequestHandlingMethodException ex){ 
     return "error/notfound"; 
    } 
} 
+0

這也許[文章將幫助你(http://www.javabeat.net/spring-mvc-404-error-page/) – rapasoft

+0

這是一個當用戶在URI中輸入任何內容(其中需要名稱)時拋出自定義異常。我想返回在瀏覽器中輸入的每個錯誤url的視圖,導致NoSuchRequestHandlingMethodException。 –

+0

NoSuchRequestHandlingMethodException被@Deprecated – BigDong

回答

0

嘗試這種方式

@ControllerAdvice 
public class AppWideExceptionHandler { 

    @ExceptionHandler(Exception.class) // replace with your exception Class 
    public String errorHandler(){ 
     System.out.println("caught exception"); 
     return "home"; // your view 
    } 
} 
+0

我試過了。它適用於你的自定義異常,但它不適用於Spring本身針對Dispatcher servlet出錯的情況 –

0

NoSuchRequestHandlingMethodException沒有引起人們的關注,是因爲調度Servlet的委託請求默認的servlet處理程序(在我的情況DefaultServletHttpRequestHandler ),並認爲它處理。我已經實現的解決方法是,我創建了一個映射'/ *'的處理程序方法,當沒有在任何控制器中找到特定的映射並且我通過新的NoSuchRequestHandlingMethodException可以在@ExceptionHandler中捕獲,然後返回自定義視圖。但是,我不知道處理這種異常的缺點。如果有的話讓我知道。

@Controller 
public class HomeController { 

... 

@RequestMapping(value = "/*", method = RequestMethod.GET) 
public void handleAtLast(HttpServletRequest request) throws NoSuchRequestHandlingMethodException { 
    throw new NoSuchRequestHandlingMethodException(request); 
    } 
} 

ExceptionHandlerController.java

@ControllerAdvice 
public class ExceptionHandlerController extends DefaultHandlerExceptionResolver { 
    @ExceptionHandler(NoSuchRequestHandlingMethodException.class) 
    public String handleNoSuchMethodtFoundException(NoSuchRequestHandlingMethodException ex){ 
     return "error/notfound"; 
    } 
}