Spring REST 接口自定義404響應內容

版本說明:Spring Boot 2.0.1.RELEASE

REST風格默認的404響應如下:

{
    "timestamp": "2018-06-07T05:23:27.196+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/shopping/123/TEST"
}

如果不想返回此內容,需要做如下配置:

application.yml

spring: 
  mvc:
    throw-exception-if-no-handler-found: true
  resources:
    add-mappings: false

添加以上配置后,404時DispatcherServlet會拋出NoHandlerFoundException,注意spring.resources.add-mappings 在當前版本下需要設置為false,否則不會拋出異常。

異常捕獲

在項目中我使用了全局異常處理,如下:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity<Object> handleExceptions(Exception ex, WebRequest request) {
        logger.error("Exception", ex);
        mailPublisher.publishMailToAdministrator(ex);

        return handleExceptionInternal(ex, RESPONSE_ERROR, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
    }
    
    /**
     * Handle NoHandlerFoundException
     * @param ex
     * @param headers
     * @param status
     * @param request
     * @return
     */
    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return handleExceptionInternal(ex, RESPONSE_ERROR, headers, status, request);
    }    
    
}

重寫ResponseEntityExceptionHandler的handleNoHandlerFoundException方法來處理404異常,注意不要在全局異常處理中添加如下方法:

    @ExceptionHandler(value = {NoHandlerFoundException.class})
    public ResponseEntity<Object> handleNotFoundExceptions(NoHandlerFoundException ex) {
        return handleExceptionInternal(ex, RESPONSE_ERROR, new HttpHeaders(), HttpStatus.NOT_FOUND, null);
    }

否則會拋出如下異常,因為ResponseEntityExceptionHandler.handleException已經注冊了對該異常的處理,如果我們再注冊一個,會有兩個異常處理,導致Ambiguous。

Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.servlet.NoHandlerFoundException]
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,951評論 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,537評論 1 92
  • 四月的天氣,乍暖還寒,在一家安靜的茶館,我緊挨著眼睛微紅的h坐下,好讓她感覺到我想要給她的溫暖,雖然早已過...
    sx遙望閱讀 163評論 0 1
  • 原來年初的時候幫朋友搞一個項目的App程序,安卓的比較方便,蘋果的在手機上測試調試了好久才成功,現在把經驗分享一下...
    IT小C閱讀 933評論 0 1