2016-02-22 5 views
4

Я не могу переопределить ответ ошибки загрузки пружины по умолчанию в REST api. У меня есть следующий код:spring boot переопределить по умолчанию обработчик исключений REST

@ControllerAdvice 
@Controller 
class ExceptionHandlerCtrl { 

    @ResponseStatus(value=HttpStatus.UNPROCESSABLE_ENTITY, reason="Invalid data") 
    @ExceptionHandler(BusinessValidationException.class) 
    @ResponseBody 
    public ResponseEntity<BusinessValidationErrorVO> handleBusinessValidationException(BusinessValidationException exception){ 
     BusinessValidationErrorVO vo = new BusinessValidationErrorVO() 
     vo.errors = exception.validationException 
     vo.msg = exception.message 
     def result = new ResponseEntity<>(vo, HttpStatus.UNPROCESSABLE_ENTITY); 
     result 

    } 

Тогда в моем REST api я выбрасываю это исключение BusinessValidationException. Этот обработчик вызван (я вижу его в отладчике), однако у меня все еще есть сообщение об ошибке REST с загрузкой по умолчанию. Есть ли способ переопределить и использовать значение по умолчанию только в качестве резервной копии? Spring Boot версии 1.3.2 с отличным дизайном. С наилучшими пожеланиями

ответ

6

Удалить из вашего метода @ResponseStatus. Это создает нежелательный побочный эффект, и вам это не нужно, поскольку вы устанавливаете HttpStatus.UNPROCESSABLE_ENTITY в свой ResponseEntity.

Из JavaDoc on ResponseStatus:

Внимание: при использовании этой аннотации на класс исключений, или когда установка атрибута причина этой аннотации, метод HttpServletResponse.sendError будет использоваться.

С HttpServletResponse.sendError ответ считается завершенным и не должен записываться ни при каких обстоятельствах. Кроме того, контейнер Servlet, как правило, создает страницу с ошибкой HTML, поэтому используется причина, непригодная для API REST. Для таких случаев предпочтительно использовать ResponseEntity в качестве типа возврата и вообще не использовать @ResponseStatus.

0

Я предлагаю вам прочитать этот вопрос: Spring Boot REST service exception handling

Там вы можете найти некоторые примеры, которые объясняют, как объединить ErrorController/ControllerAdvice, чтобы поймать любое исключение.

В частности, проверка этот ответ:

https://stackoverflow.com/a/28903217/379906

Вы, вероятно, следует удалить аннотацию @ResponseStatus от метода handleBusinessValidationException.

Другой способ, с помощью которого вы должны переписать сообщение об ошибке по умолчанию, - это использовать контроллер с аннотацией @RequestMapping ("/ error"). Контроллер должен реализовывать интерфейс ErrorController.

Это контроллер ошибок, который я использую в своем приложении.

@RestController 
@RequestMapping("/error") 
public class RestErrorController implements ErrorController 
{ 
    private final ErrorAttributes errorAttributes; 

    @Autowired 
    public MatemoErrorController(ErrorAttributes errorAttributes) { 
     Assert.notNull(errorAttributes, "ErrorAttributes must not be null"); 
    this.errorAttributes = errorAttributes; 
    } 

@Override 
public String getErrorPath() { 
    return "/error"; 
} 

@RequestMapping 
public Map<String, Object> error(HttpServletRequest aRequest) { 

    return getErrorAttributes(aRequest, getTraceParameter(aRequest)); 
} 

private boolean getTraceParameter(HttpServletRequest request) { 
    String parameter = request.getParameter("trace"); 
    if (parameter == null) { 
     return false; 
    } 
    return !"false".equals(parameter.toLowerCase()); 
} 

private Map<String, Object> getErrorAttributes(HttpServletRequest aRequest, boolean includeStackTrace) 
{ 
    RequestAttributes requestAttributes = new ServletRequestAttributes(aRequest); 
    return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace); 
} }