spring boot 原生錯誤處理ErrorController

最近開始使用springboot,發現一個奇怪的現象,一個url報錯

使用瀏覽器地址請求返回一個html界面

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Nov 29 10:48:26 CST 2016
There was an unexpected error (type=Bad Request, status=400).
Required String parameter 'fileName' is not present


使用postman請求返回一個json格式的響應

{
    "timestamp": 1480388264722,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
    "message": "Required String parameter 'fileName' is not present",
    "path": "/file/delete"
}

究竟spring boot怎麼來區分這種請求返回不同格式的數據的呢。經過一步步跟進。精髓在BasicErrorController這個類上

@RequestMapping(
        value = {"${error.path:/error}"},
        produces = {"text/html"}
    )
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("error", this.getErrorAttributes(request, false));
    }

    @RequestMapping({"${error.path:/error}"})
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map body = this.getErrorAttributes(request, this.getTraceParameter(request));
        HttpStatus status = this.getStatus(request);
        return new ResponseEntity(body, status);
    }


spring boot 根據Accept頭的內容,輸出不同格式的錯誤響應。比如針對瀏覽器的請求生成html頁面,針對其它請求生成json格式的返回。字段爲accept的text/html的內容來判斷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章