3

我有一個Spring控制器,註釋爲@RestController,它返回JSON。我也有一個課程註釋@ControllerAdvice@ExceptionHandler s有關的一些自定義例外。我正在使用Tomcat來提供此RESTful API。我希望有任何非自定義異常(例如來自第三方庫或Nu​​llPointerException的異常)被捕獲並返回狀態爲500 - 內部服務器錯誤爲帶有消息的JSON,而不是顯示錯誤的HTML頁面。在Spring控制器上返回未捕獲異常的JSON

如果我在控制器建議中使用@ExceptionHandler(Exception.class),它會接管所有Spring異常,如MissingPathVariableException.class,這是不理想的。我試過擴展Sp​​ring的ResponseEntityExceptionHandler,但這個類沒有用@ResponseBody註釋,所以不返回JSON。

  1. 如何在Spring RESTful API中爲未捕獲和未知異常(無法計劃的異常)返回JSON而不影響Spring的內部?
  2. 如何關閉完全返回的HTML,並確保只有JSON響應,無論請求是否有異常?

回答

1

回訪JSON上捕獲的異常,你可以使用此代碼:

import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.RestController; 

@ControllerAdvice 
@RestController 
public class GlobalExceptionHandler { 

    private class JsonResponse { 
     String message; 

     public JsonResponse() { 
     } 

     public JsonResponse(String message) { 
      super(); 
      this.message = message; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public void setMessage(String message) { 
      this.message = message; 
     }  
    } 

    @ExceptionHandler(value = Exception.class) 
    public ResponseEntity<JsonResponse> handleException(Exception e) { 
     return new ResponseEntity<JsonResponse>(new JsonResponse(e.getMessage()), HttpStatus.BAD_REQUEST); 
    } 

} 

JSON的結果,如果異常被拋出:

{ 
    "message": "Something wrong!" 
} 

您可以使用此link關於春天的更多詳細信息異常處理(使用代碼示例)。