Неожиданное поведение при настройке ExceptionResolver весной
Из документации среды Spring я узнал о настройке механизма обработки исключений в приложении Spring. Согласно документации, указано, что Spring предоставляет некоторые исключения по умолчанию Resolvers.
SimpleMappingExceptionResolver
Сопоставление между именами классов исключений и именами представления ошибок. Полезно для рендеринга страниц с ошибками в приложении браузера.
DefaultHandlerExceptionResolver
Разрешает исключения, возникающие в Spring MVC, и сопоставляет их с кодами состояния HTTP. См. Также альтернативные исключения ResponseEntityExceptionHandler и REST API.
ResponseStatusExceptionResolver
Разрешает исключения с помощью аннотации @ResponseStatus и сопоставляет их с кодами состояния HTTP на основе значения в аннотации.
ExceptionHandlerExceptionResolver
Разрешает исключения, вызывая метод @ExceptionHandler в классе @Controller или @ControllerAdvice. Смотрите методы @ExceptionHandler.
Но в моем требовании я не хочу поддержки всех этих преобразователей. Я просто хочу, чтобы ExceptionHandlerExceptionResolver обрабатывал исключение в моем приложении Spring. Поэтому для этого я добавил следующую конфигурацию в свой DispatcherServlet.
DispatcherServlet связанная конфигурация.
public void onStartup(ServletContext servletCxt) throws { ServletException {
......
dServlet.setDetectAllHandlerExceptionResolvers(false);
dServlet.setThrowExceptionIfNoHandlerFound(false);
.....
}
И в моем Java-классе конфигурации Bean я создал следующий bean-компонент.
@Bean(name=DispatcherServlet.HANDLER_EXCEPTION_RESOLVER_BEAN_NAME)
HandlerExceptionResolver customExceptionResolver ( ) {
return new ExceptionHandlerExceptionResolver();
}
В документации указано, что
/** * Укажите, нужно ли обнаруживать все bean-компоненты HandlerExceptionResolver в контексте этого сервлета. В противном случае * ожидается только один компонент с именем "handlerExceptionResolver". *
По умолчанию "true". Отключите эту опцию, если хотите, чтобы этот сервлет использовал один * HandlerExceptionResolver, несмотря на то, что в контексте определено несколько bean-компонентов HandlerExceptionResolver. */
Но даже после такой конфигурации я вижу страницы ошибок HTML, а не сообщение об ошибке JSON.
Пример метода ExceptionHandler.
@ExceptionHandler(value={NullPointerException.class})
public ResponseEntity<Object> nullPointerExceptionHandler(NullPointerException e){
logger.info("local exception resolver running");
Map<String,Object> map=new HashMap<String,Object>(6);
map.put("isSuccess",false);
map.put("data",null);
map.put("status",HttpStatus.INTERNAL_SERVER_ERROR);
map.put("message", e.getMessage());
map.put("timestamp",new Date());
map.put("fielderror",null);
return new ResponseEntity<Object>(map,HttpStatus.BAD_GATEWAY);
}
Что я делаю не так? Мне нужна только поддержка ExceptionHandlerExceptionResolver на протяжении всего моего весеннего приложения для поддержания согласованности.