2013-07-23 2 views
1

У меня есть обработчик исключений, подобный этому, который создаст объект ошибки json, который будет использоваться javascript в представлении.Spring @ExceptionHandler - применяется к json, производящему только @RequestMapping

@ControllerAdvice 
public class ExceptionHandlerController { 


    @ExceptionHandler(value = Exception.class) 
    @ResponseBody 
    public final JsonResponse<Void> handleJsonException(
      final Exception e, 
      final HttpServletRequest request, 
      final HttpServletResponse response) { 
     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     return new ErrorJsonResponse(e); 
    } 

} 

Я не хочу, чтобы этот метод выполнялся для регулярных запросов обратной передачи (не json). Поэтому я хотел бы, чтобы эти виды исключений обрабатывались WEB.XML настроенными страницами ошибок.

<error-page> 
    <error-code>500</error-code> 
    <location>/500</location> 
</error-page> 

В моих методах @RequestMapping, которые возвращают json, я явно устанавливаю значение generate.

@RequestMapping(value = "/dosomething", 
     method = RequestMethod.POST, 
     produces = MediaType.APPLICATION_JSON_VALUE) 

Как я могу сказать весне использовать конкретный обработчик исключений на основе типа содержимого контента?

+0

Как я помню Весна '@ ControllerAdvice' не обрабатывает такие ошибки HTTP, как 400, 401 и т. Д. У меня есть эта проблема один раз, но я смог перевернуть на основе шаблона URL (каждый запрос JSON был вызван в контекст '/ api'). Вы можете попытаться перенаправить местоположение в web.xml на некоторый '@ Controller' и попытаться разобрать информацию о запросе, после этого определите конкретное исключение, которое будет ловить на' @ ControllerAdvice' –

+0

ExceptionHandler обрабатывает все исключения, которые бросают контроллер. Таким образом, единственный способ, по которому я вижу, - переместить страницу ошибки внутри вашего приложения и выбрать, какая страница будет возвращена внутри метода ExceptionHandler. Для этой цели вы можете использовать HttpServletRequest. – mvb13

ответ

0

@ControllerAdvice аннотированные классы помогают всем известным контроллерам в приложении. Разработчики обычно ограничивают ExceptionHandlers в некоторых случаях с использованием особых бизнес-технических исключений; в этом случае Exception.class слишком широк.

Но ваш прецедент действителен - на самом деле эта проблема была решена (см. SPR-10222) для предстоящей версии Spring 4.0.

Вы могли бы, например, иметь RestExceptionHandlerController аннотированное с @ControllerAdvice(annotations = RestController.class) - учитывая ваш REST Контроллеры аннотированный с @RestController (аннотацией, подразумевающей @ResponseBody всех методов!).

Однако эта новая функция не полагается на MediaTypes (согласованные во время выполнения, в зависимости от запроса клиента), но и на аннотациях, присваиваемых типах, пакетах, базовых классах пакетов ... Я думаю, что это могло бы помочь вам структурировать ваш @ControllerAdvice аннотированный классы.

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