Неожиданное поведение при настройке ExceptionResolver весной - PullRequest
0 голосов
/ 21 октября 2018

Из документации среды Spring я узнал о настройке механизма обработки исключений в приложении Spring.Согласно документации, утверждается, что spring предоставляет некоторые исключения по умолчанию.

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, несмотря на то, что несколько контекстов 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 на протяжении всего моего весеннего приложения для поддержания согласованности.

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