2013-09-02 2 views
6

У меня есть метод обработки определенного класса исключений в среде Spring MVC. Metod (упрощенно) реализация следуетExceptionHandler с ResponseBody: установите ResponseStatus в тело метода

@ExceptionHandler(AjaxException.class) 
@ResponseStatus(value=HttpStatus.BAD_REQUEST) 
@ResponseBody 
public Exception handleException(AjaxException ex) { 
    return ex; 
} 

Это прекрасно работает, но возвращать различные ResponseStatus я должен создать новый метод обработки.

Можно ли изменить статус ответа внутри тела метода вместо использования аннотации @ResponseStatus без изменения типа возврата?

Если нет, возможно ли добиться того же результата, который изменит тип возвращаемого значения (может быть, сериализация класса исключения сама по себе и возвращение его в виде строки)?

ответ

4

Добавить метод HttpServletResponse в подпись метода и просто вызвать метод setStatus.

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public Exception handleException(AjaxException ex, HttpServletResponse response) { 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    return ex; 
} 

Нечто подобное должно работать.

+0

Правильно! Я нашел это решение самостоятельно, но приложение все время работало неправильно ... проблема была в другом месте – Gabber

2

Легко сделано, внимательно прочитав весеннюю документацию.

В качестве параметра объекта можно передать HttpServletResponse. В таком объекте можно установить код возврата. Синтаксис следующий:

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public AjaxException handleException(AjaxException ex,HttpServletResponse response) { 
      //test code ahead, not part of the solution 

      //throw new NullPointerException(); 

      //end of test code 


    response.setStatus(404);//example 
    return ex; 
} 

Это вернет сериализацию json исключения вместе с указанным кодом возврата http.

EDIT: Вчера я удалил этот ответ, потому что это решение, похоже, не работает. Проблема была немного сложнее: когда вы управляете исключением таким образом, если метод, аннотированный с помощью ExceptionHandler, выдает исключение, то исключенное исключение игнорируется и вместо этого генерируется исходное исключение.

Мой код был как-то вроде решения, которое я опубликовал (это вызвало исключение в начале метода), поэтому я не мог видеть выход json, вместо этого был запущен стандартный обработчик исключений Spring. Чтобы решить проблему, я просто попробовал строку исключения, и все было в порядке.

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