2017-03-30 40 views
0

我有這個控制器Spring MVC的默認@RequestMapping趕上無與倫比的URL

@Controller 
@RequestMapping(value = "/v1.0/user") 
public class UserController { 

    @RequestMapping(value = "/findOne/{id}", method = RequestMethod.GET) 
    public @ResponseBody String findOne(@PathVariable("id") Integer id) { 
     log.info("findOne"); 
     return "found URL"; 
    }  

} 

將匹配的網址:http://localhost:8080/v1.0/user/findOne/4

但如果我的路徑varibale是不正確的:http://localhost:8080/v1.0/user/findOne/4A

的我一無所獲。甚至沒有錯誤。就好像Spring吞噬了URL。

我加

@RequestMapping(value = "/.*", method = RequestMethod.GET) 
public @ResponseBody String redirectEverythingOtherThanTest(){ 
    log.info("no url matched"); 
    return "badly formed URL for Users"; 
} 

我又什麼也得不到。我試圖完成的是每個控制器在URL不匹配時都有唯一的消息。

+0

也許這可以幫助你。 http://stackoverflow.com/questions/25356781/spring-boot-remove-whitelabel-error-page –

+0

我認爲你必須得到500,當你用'4A' pathVariable運行時,因爲它會在嘗試時拋出一個異常從它創建一個整數。你能檢查迴應的狀態代碼嗎?問題是你的URL匹配,因爲'{id}'將覆蓋'/ findOne /'之後的所有內容。最好在你的控制器中使用'id'作爲'String',並在創建一個'Integer'前驗證它的值。 –

+0

其實第一個問題是我有一個ControllerAdvice,它擴展了ResponseEntityExceptionHandler,它有一個BindException.class句柄。我刪除了ControllerAdvice,現在我得到了一個400錯誤。但是,我可以將400映射到控制器中的特定catch方法嗎? –

回答

0

在我的每個控制器類的末尾我加

@ExceptionHandler(Exception.class) 
public @ResponseBody String handleException(Exception e, HttpServletRequest request, HttpServletResponse response) { 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    return e.getMessage(); 

} 

,這將捕獲所有異常,我可以把它當作一個包羅萬象的。