Как получить доступ к модели из HandlerExceptionResolver в Spring? - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть реализация Spring AbstractHandlerExceptionResolver в моем проекте.Этот обработчик заботится обо всех исключениях, выданных из контроллеров.По большей части это работает очень хорошо при обработке наших исключительных случаев и переводе их в представления / HTTP-ответы.

Однако у нас есть требование, чтобы что-то записывалось в заголовки ответа в любой ситуации (даже ошибки).Эти данные должны быть сконфигурированы / установлены в самих действиях контроллера (так как они привязаны к тому, что контроллеры делают).Итак, я пытаюсь донести эти данные до моих представлений, чтобы их можно было использовать.

Логически, имеет смысл поместить эти данные в модель ... Однако, похоже, что интерфейс HandlerExceptionResolver не сохраняет ничего из того, что контроллер установил в модели (который будет содержать данные контроллерадолжен установить).

Есть ли способ доступа к значениям модели контроллера в реализации HandlerExceptionResolver?

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2011

Позвольте мне сначала подвести итог: * у вас есть метод контроллера MVC * если в этом методе контроллера есть исключение, то вы хотите взять модель и сделать что-то другое (тогда, когда нет исключения)

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

public ModelAndView myController() {
    Model model = new Model();
    model.put(...); 
    try {
       ...
       return new ModelAndView("success", model);
    } catch (SomethingWrongException e) {
       return new ModelAndView("failure", model);   
    }        
}

Возможно, вы заметили, что в блоке try отсутствует популяция модели.- Потому что, если он будет в блоке try, вы не должны использовать его в предложении catch, потому что, возможно, он не заполнен.

Но это то, что вы пытаетесь.То, что вы пытаетесь, немного похоже на это (с концептуальной точки зрения зрения):

try {
   ModelAndView modelAndView = invoke.myController()
} catch (Exception e) {
   doSomethingWith(modelAndView);
}

Так что, в общем, я верю, что вы пытаетесь кое-что, что не так (Если это сквозная проблема, то она не должна зависеть от модели)


В любом случае: давайте найдем способ заставить ее работать.Поскольку метод не может ничего возвратить, если он выдает исключение, я предполагаю, что ваш метод контроллера выглядит следующим образом:

public String myControllerMethod(ModelMap myModel) {
   myModel.put(...);
   if (Math.random()<0.5) {
     throws new RuntimeException("only a example");
   }
}

Потому что вы, что использовать HandlerExceptionResolver, а не конкретный try / catch, я думаю, у васстранная перекрестная проблема, которая использует модель.Для его реализации я бы использовал АОП.Я бы добавил точку среза и совет arround для методов контроллера, которые возвращают другое имя представления, если выброшено исключение.

public aspect ServletExceptionReporterAspect {

pointcut stringRequestHandler() : 
    execution (@RequestMapping String com.demo..*(ModelMap));

String around(ModelMap model): stringRequestHandler(){
    try {
        return proceed(model);
    } catch (Exception ex){
        System.out.println(model);
        return "myErrorView";
    }
}   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...