首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring中从HandlerExceptionResolver访问模型?

如何在Spring中从HandlerExceptionResolver访问模型?
EN

Stack Overflow用户
提问于 2011-04-20 00:35:33
回答 1查看 2.6K关注 0票数 4

我的项目中有一个Spring AbstractHandlerExceptionResolver的实现。这个处理程序负责处理从控制器抛出的所有异常。在大多数情况下,这可以很好地处理我们的异常情况,并将它们转换为视图/HTTP响应。

然而,我们有一个要求,在每种情况下(即使是错误),都必须向响应头写入一些内容。此数据必须在控制器操作本身中配置/设置(因为它与控制器正在执行的任何操作相关)。因此,我正在尝试将这些数据传递到我的视图中,以便可以使用。

从逻辑上讲,将这些数据放入模型中是有意义的……但是,看起来HandlerExceptionResolver接口不会持久化控制器在模型中设置的任何内容(它将包含控制器必须设置的数据)。

有没有办法在HandlerExceptionResolver实现中访问控制器的模型值?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-20 01:22:31

首先让我总结一下:*你有一个MVC控制器方法*如果这个控制器方法中有一个异常,那么你想要获取模型并做一些不同的事情(然后当没有异常时)。

对我来说,这看起来像是正常的异常处理:

代码语言:javascript
复制
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子句中使用它,因为它可能没有被填充。

但这就是你要尝试的。您尝试的内容有点像这样(从概念性的角度来看):

代码语言:javascript
复制
try {
   ModelAndView modelAndView = invoke.myController()
} catch (Exception e) {
   doSomethingWith(modelAndView);
}

因此,总的来说,我相信你尝试了一些至少不那么可取的事情。(如果它是一个横切关注点,那么它不应该依赖于模型)

不管怎样:让我们找到一种让它工作的方法。因为如果一个方法抛出异常,它就不能返回任何东西,所以我假设你的控制器方法看起来像这样;

代码语言:javascript
复制
public String myControllerMethod(ModelMap myModel) {
   myModel.put(...);
   if (Math.random()<0.5) {
     throws new RuntimeException("only a example");
   }
}

因为您需要使用HandlerExceptionResolver而不是concreate try/catch,所以我猜您有一个奇怪的交叉关注点,那就是使用模型。为了实现它,我会使用AOP。我会为控制器方法添加一个point cut和arround建议,如果抛出异常,它们将返回另一个视图名称。

代码语言:javascript
复制
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";
    }
}   
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5719683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档