Не могу подчинить @ExceptionHandler

 
 
 
Сообщения:110
Мне надо обрабатывать все исключения в одном методе, назовем его handleConflict.
Но я не до конца понимаю как это можно реализовать.Поэтому нужна помощь.
Все что я смог сделать:
Вот у меня есть класс GlobalExceptionHandler в котором хочу обработать все исключения и класс MainController в котором возникает исключение.
Вот сам код:

@ControllerAdvice
public class GlobalExceptionHandler  {

    @ExceptionHandler(value = Exception.class)
    public String handleConflict(Map<String, Object> model, HttpServletRequest req, Exception e)
    {
        .....//то что тут не важно так как сюда все равно не заходит
        System.out.println("LALALAL");
    }
}


В MainController ничего интересного там все работает как надо, просто строчка кода:
throw new RuntimeException("You are not authorized");

Естественно в терминале IDE кидает сообщение о исключении и в браузере кидает инфу, как будто моего метода handleConflict и не существует.
В браузере:
HTTP Status 500 - Request processing failed; nested exception is java.lang.RuntimeException: You are not authorized
type Exception report
message Request processing failed; nested exception is java.lang.RuntimeException: You are not authorized
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.RuntimeException: You are not authorized
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEn...........

root cause

java.lang.RuntimeException: You are not authorized
ru.javastudy.springMVC.controller.MainController.showPageMessages(MainController.java:49)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)

Кунг-фу принцип: не сталкиваться лоб в лоб с внешними силами,а прогнуться под их давлением с тем, чтобы, разогнувшись, стать еще сильнее.
 
 
Сообщения:456
Меня смущает параметр Map<String, Object> model, который вы в обработчик передаете. В документации не написано что Map является допустимым типом параметра.
 
 
Сообщения:110
izon, спасибо. Ошибка в аргументах.
Но теперь получилась несовместимость.
И вот почему:
У меня в классе AbstractModels расположены модели такие как например эта:
@ModelAttribute
    public static Search createSearch(){
        return new Search();
    }

Данный класс я хотел сделать глобальным для всех исключений:

@ControllerAdvice
public class GlobalExceptionHandler extends AbstractModels {
...

Но когда мы заходим в метод handleConflict
    @ExceptionHandler(value = Exception.class)
    public ModelAndView handleConflict( HttpServletRequest req, Exception e) throws Exception
               {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exceptionMsg", "ExceptionHandler msg: " + e.toString());
        mav.addObject("url", req.getRequestURL());
        mav.setViewName("error/exception");
        return mav;
    }

То при отображении страницы error/exception:

    <definition name="template" template="/WEB-INF/views/main_template.jsp">
        <put-attribute name="menu" value="/WEB-INF/views/tiles/menuB.jsp" />
        ....
    </definition>

<definition name="error/exception" extends="template">
        <put-attribute name="content" value="/WEB-INF/views/content/exception.jsp" />
</definition>


Требуются в этих jsp файлах бины(модели), например модель search нужна в menuB.jsp.
И естественно spring не хочет смотреть на @ModelAttribute потому что класс GlobalExceptionHandler помечен аннотацией @ControllerAdvice.
Другие мои классы помеченные аннотацией @Controller работают по отлаженной схеме(тоесть spring смотрит на @ModelAttribute и берет данную модель тянет до самой jsp страницы).
Перенес метод handleConflict в AbstractModels и опять несовместимость:
ModelAndView в методе handleConflict не хочет работать с @ModelAttribute.
Буду искать другие способы обработки исключений совместимые с @ModelAttribute.

Кунг-фу принцип: не сталкиваться лоб в лоб с внешними силами,а прогнуться под их давлением с тем, чтобы, разогнувшись, стать еще сильнее.
Изменен:09 окт 2016 05:58
 
 
Сообщения:456
В документации сказано, что для обработчиков помеченных аннотацией @ExceptionHandler не доступны @ModelAttribute.
Но вам же доступны HttpServletRequest/HttpServletResponse, попробуйте оттуда получать нужные вам данные и строить модель в обработчике.
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет