2016-10-25 2 views
0

У меня есть API, построенный с использованием Spring Boot. По умолчанию структура JSON по умолчанию при ошибке генерируется Spring;Изменение настроек 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; 
     } 
    } 
} 

Частные классы ErrorListModel и ExceptionModel просто помогают определения того, как в результате JSON тело должно выглядеть, и я предполагаю, что у вас уже есть свои собственные, подобные классы.

Метод find просто бросает исключение для нас для обработки, который получает перехвачен методом handleException, потому что он с аннотацией @ExceptionHandler. Здесь мы создаем ExceptionModel, заполняем его информацией из исходного исключения и добавляем его в ErrorListModel, который мы затем возвращаем.

This blog post с 2013 года объясняет функции лучше, чем я когда-либо мог, а также упоминает дополнительную опцию, @ControllerAdvice. Это в основном позволяет вам повторно использовать обработку исключений в других контроллерах.

+0

Спасибо. В моем проекте у меня есть ExceptionConntroller, который аннотируется с ControllerAdvice, там я помещаю ExceptionHandlers. Я уже пытался создать обработчик Exception, но, к сожалению, мне кажется, что я не могу получить ответ Spring Standard 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 вместе с возвращаемым весом кода состояния заголовка/http.

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

Это, кажется, работает отлично подходит для ошибок, генерируемых весной, в то время как мои собственные исключения я обработки в контроллерах или в определенном классе ControllerAdmin с ExceptionHandlers.

Смежные вопросы