我正在尋找一種乾淨的方式,以便在找不到請求的資源時在Spring 4中返回自定義的404錯誤頁面。對不同的域類型的查詢應該導致不同的錯誤頁面。Spring MVC:如何返回自定義404錯誤頁面?
這裏是一些代碼來顯示我的意圖(儀表是域類):
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model) {
final Meter result = meterService.findOne(number);
if (result == null) {
// here some code to return an errorpage
}
model.addAttribute("meter", result);
return "meters/details";
}
我想像處理這個問題的幾種方法。首先將有可能創造RuntimeException
就像
@ResponseStatus(HttpStatus.NOT_FOUND)
public class MeterNotFoundExcption extends RuntimeException { }
,然後使用異常處理程序來呈現一個自定義的errorPage(也許包含鏈接到米列表或任何爲宜)。
但我不喜歡用很多小例外來污染我的應用程序。
另一種可能性是使用HttpServletResponse
和手動設置的StatusCode:
@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model,
final HttpServletResponse response) {
final Meter meter = meterService.findOne(number);
if (meter == null) {
response.setStatus(HttpStatus.NOT_FOUND.value());
return "meters/notfound";
}
model.addAttribute("meter", meter);
return "meters/details";
}
但是這種解決方案我必須重複第一5行許多控制器方法(如修改,刪除)。
有沒有一種優雅的方式來防止重複這些行很多次?
呃,沒有。這實際上並沒有如預期的那樣工作,因爲在控制器內部進行這樣的異常處理時,當找不到'meter'時,響應的HTTP狀態仍然是「200」而不是「404」。您確實爲用戶顯示了一個不錯的頁面,但瀏覽器會收到一個響應,指示請求已成功處理。 –
感謝您的提示。我只是重新檢查了我的代碼,你是對的。 'ResponseStatus'註釋應該放在異常處理器上。我確定了我的答案。 –