2016-10-25 40 views
0

我有一個使用Spring Boot構建的API。默認情況下,Spring引發錯誤時的默認JSON結構是;更改Spring Boots默認JSON錯誤響應結構

{ 
    "timestamp": 1477425179601, 
    "status": 404, 
    "error": "Not Found", 
    "message": "No message available", 
    "path": "/categoriess" 
} 

這種結構是不同的錯誤響應的API在返回自己,所以我想改變Spring使用相同的結構,我自己的一致性。

我的錯誤響應是這樣構造的;

{ 
    "errors": [ 
     { 
      "code": 999404, 
      "message": "The resource you were looking for could not be found" 
     } 
    ] 
} 

我該如何去做這件事?我試過使用異常處理程序,但我無法弄清楚設置它的正確例外。我也想確保Http狀態仍然正確返回爲404,或者錯誤是(500等)。

回答

0

執行此類操作的一種可能方法是使用@ExceptionHandler註釋在控制器內部創建處理程序方法。

@RestController 
@RequestMapping(produces = APPLICATION_JSON_VALUE) 
public class MyController { 

    @RequestMapping(value = "/find", method = GET) 
    public Object find() { 
     throw new UnsupportedOperationException("Not implemented yet!"); 
    } 

    @ExceptionHandler 
    public ErrorListModel handleException(Exception exception) { 
     ExceptionModel exceptionModel = new ExceptionModel(1337, exception.getMessage()); 

     ErrorListModel list = new ErrorListModel(); 
     list.add(exceptionModel); 

     return list; 
    } 

    private class ErrorListModel { 
     private List<ExceptionModel> errors = new ArrayList<>(); 

     public void add(ExceptionModel exception) { 
      errors.add(exception); 
     } 

     public List<ExceptionModel> getErrors() { 
      return errors; 
     } 
    } 

    private class ExceptionModel { 
     private int code; 
     private String message; 

     public ExceptionModel(int code, String message) { 
      this.code = code; 
      this.message = message; 
     } 

     public int getCode() { 
      return code; 
     } 

     public String getMessage() { 
      return message; 
     } 
    } 
} 

的私有類​​和ExceptionModel只是幫助確定所產生的JSON體應該如何看,我假設你已經有了自己的,類似的類。

find方法只是拋出一個異常給我們處理,它被handleException方法攔截,因爲它的註釋是@ExceptionHandler。在這裏,我們創建一個ExceptionModel,用來自原始異常的信息填充它,然後將其添加到​​,然後我們返回。

This blog post從2013年開始解釋功能比我以前更好,它還提到了一個額外的選項,@ControllerAdvice。它基本上允許您在其他控制器中重新使用異常處理。

+0

謝謝。在我的項目中,我有一個使用ControllerAdvice註釋的ExceptionConntroller,在那裏放置了ExceptionHandlers。我已經嘗試創建一個異常處理程序,但遺憾的是我似乎無法捕捉到Spring標準404 Not Found響應。我試過上面的例子,它也沒有抓住它。 – SheppardDigital

+0

然後這篇文章可能會爲您解答一些問題:http://stackoverflow.com/questions/28902374 –

0

我又看了一眼,確實設法把一些東西放在一起,這對我很有用。

@Bean 
    public ErrorAttributes errorAttributes() { 
     return new DefaultErrorAttributes() { 
      @Override 
      public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) { 
       Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace); 

       Map<String, Object> error = new HashMap<>(); 
       error.put("code", errorAttributes.get("status")); 
       error.put("message", errorAttributes.get("error")); 

       Map<String, Object> errorResponse = new HashMap<>(); 
       errorResponse.put("errors", error); 

       return errorResponse; 
      } 
     }; 
    } 

這將返回以下JSON響應以及Spring將返回的任何標頭/ http狀態碼。

{ 
    "errors": { 
    "code": 404, 
    "message": "Not Found" 
    } 
} 

這似乎是工作偉大的彈簧產生的錯誤,而我自己的異常,我在處理控制器或與的ExceptionHandlers特定ControllerAdmin類。