如何从Spring中的HandlerExceptionResolver访问模型?

时间:2011-04-19 16:35:33

标签: java model-view-controller spring servlets spring-mvc


我的项目中有一个Spring AbstractHandlerExceptionResolver的实现。此处理程序负责处理从控制器抛出的所有异常。在大多数情况下,这非常适用于处理我们的特殊情况并将它们转换为Views / HTTP响应。

但是,我们要求必须在每种情况下(甚至错误)将某些内容写入响应头。必须在控制器操作本身中配置/设置此数据(因为它与控制器正在执行的操作相关联)。所以,我正在尝试将这些数据传递给我的视图,以便可以使用它。

逻辑上,将此数据放入模型中是有意义的...但是,看起来HandlerExceptionResolver接口不会保留Controller在模型中设置的任何内容(包含控制器必须包含的数据)组)。

有没有办法在HandlerExceptionResolver实施中访问Controller的模型值?

谢谢!

1 个答案:

答案 0 :(得分:3)

首先让我总结一下:   *你有一个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而不是concreate的尝试/ catch我猜你有一个使用Model的奇怪的交叉关注问题。为了实现它,我会使用AOP。我会为控制器方法添加一个切入点和一个循环建议,如果抛出异常则返回另一个视图名称。

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";
    }
}   
}