Spring3 @ExceptionHandler для ServletRequestBindingException - PullRequest
4 голосов
/ 01 марта 2011

Я использую AnnotationMethodHandlerAdapter по умолчанию, который, я считаю, должен включить поддержку @ExceptionHandler.К несчастью, ServletRequestBindingException генерируется, если поступает вызов метода-обработчика, подобного приведенному ниже, а не вызывается обработчик исключений.

@RequestMapping(value = "/v1/products/{code}", method = RequestMethod.GET, headers = "Accept=application/xml,application/json")
@ResponseBody
public ProductDemoDTO getProductByCode(@PathVariable final String code,
        @RequestParam(required = false, defaultValue = "BASIC") final String options)
{
    //omitted
}

Здесь ExceptionHandler, никогда не вызывался:

@ExceptionHandler(Throwable.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
//TODO not being called?
public void handleException(final Exception e, final HttpServletRequest request, final Writer writer) throws IOException
{
    writer.write(String.format("{\"error\":{\"java.class\":\"%s\", \"message\":\"%s\"}}", e.getClass(), e.getMessage()));
}

Кто-нибудь знает, почему не вызывается ExceptionHandler?

Ответы [ 4 ]

3 голосов
/ 15 декабря 2012

Эта проблема исправлена ​​в Spring 3.2. Вы можете создать глобальный класс обработчика исключений с аннотацией @ControllerAdvice. Затем в этом классе добавьте метод @ExceptionHandler для обработки исключения ServletRequestBindingException и возврата тела настраиваемого ответа. Пример:

@ControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(ServletRequestBindingException.class)
  public ResponseEntity<String> handleServletRequestBindingException(ServletRequestBindingException ex)   {
      return new ResponseEntity<String>("MISSING REQUIRED HEADER",HttpStatus.PRECONDITION_REQUIRED);
  }
}

Для получения дополнительной информации проверьте документы MVC пружины: 17.11 Обработка исключений

2 голосов
/ 01 марта 2011

К сожалению, методы @ExceptionHandler вызываются только для исключений, которые выбрасываются из в метода-обработчика.ServletRequestBindingException - это исключение инфраструктуры, которое выдается при попытке вызвать метод-обработчик, и если сам метод-обработчик не может быть вызван по какой-либо причине, то @ExceptionHandler не используется.

Кажется, на самом деле нет лучшего способа справиться с этим.Однако, не зная, что вызывает у вас ServletRequestBindingException, трудно советовать.

1 голос
/ 01 марта 2011

вы не можете справиться с этим в пользовательской реализации Spring.

это может быть не элегантное решение, но вы все равно можете поймать его с помощью тега web.xml <error-page>отсюда вы можете узнать тип исключения или код ошибки.

0 голосов
/ 31 марта 2016

А и благодаря Юргену Хеллеру это было решено сегодня и должно появиться в Весна 4.3 .

Пожалуйста, обратитесь к вопросу: https://jira.spring.io/browse/SPR-11106

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...