Позвольте мне сначала подвести итог: * у вас есть метод контроллера 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";
}
}
}