Получение контекстной информации в обработчиках исключений Spring 3.0 - PullRequest
1 голос
/ 18 августа 2011

Я пытаюсь настроить схему для единообразной обработки исключений в Spring. Поэтому мне нужен способ передачи контекстной информации в @ExceptionHandler -аннотированный метод, например, рассмотрим следующее:

@ExceptionHandler(Exception.class)
public void handleException(Exception ex, HttpServletRequest request) {
    // Need access to myContext from login()
}

@RequestMapping(value = "{version}/login", method = RequestMethod.POST)
public void login(HttpServletRequest request, @PathVariable String version, @RequestParam("userName") String userName, @RequestParam("password") String password, ModelMap model) throws Exception {
    ...
    myContext = "Some contextual information"
    ...
    i_will_always_throw_an_exception();
}

Поскольку Spring отвечает за преобразование сгенерированного исключения в вызов handleException(), я испытываю затруднения, пытаясь найти способ передать myContext обработчику. Одна мысль, которую я имею, создает подкласс HttpServletRequest. Если этот подход работает, у меня будет такой код:

@ExceptionHandler(Exception.class)
public void handleException(Exception ex, MyCustomHttpServletRequest request) {
    // I now have access to the context via the following
    String myContext = request.getContext();
}

@RequestMapping(value = "{version}/login", method = RequestMethod.POST)
public void login(MyCustomHttpServletRequest request, @PathVariable String version, @RequestParam("userName") String userName, @RequestParam("password") String password, ModelMap model) throws Exception {
    ...
    myContext = "Some contextual information"
    request.setContext(myContext);
    ...
    i_will_always_throw_an_exception();
}

Но, если я буду следовать этому подходу, как мне правильно использовать мой собственный произвольный подкласс HttpServletRequest, чтобы эта работа работала?

1 Ответ

1 голос
/ 18 августа 2011

Разве вы не можете просто поместить его в исключение (при необходимости - перенести исходное исключение в новое)?

@ExceptionHandler(MyContextualException.class)
public void handleException(MyContextualException ex) {
    // Need access to myContext from login()
}

@RequestMapping(value = "{version}/login", method = RequestMethod.POST)
public void login(HttpServletRequest request, @PathVariable String version, @RequestParam("userName") String userName, @RequestParam("password") String password, ModelMap model) throws Exception {
    ...
    myContext = "Some contextual information"
    ...
    try {
        i_will_always_throw_an_exception();
    } catch (Exception ex) {
        throw new MyContextualException(myContext, ex);
    }
}

Альтернативный подход - передать контекст как атрибут запроса:

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