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

Java 如何在Spring中从HandlerExceptionResolver访问模型?,java,model-view-controller,spring,servlets,spring-mvc,Java,Model View Controller,Spring,Servlets,Spring Mvc,我的项目中有一个SpringAbstractHandlerExceptionResolver的实现。此处理程序负责从控制器引发的所有异常。在大多数情况下,这可以很好地处理异常情况并将其转换为视图/HTTP响应 但是,我们有一个要求,即在任何情况下(甚至错误),都必须向响应头写入某些内容。此数据必须在控制器操作本身中配置/设置(因为它与控制器正在执行的任何操作相关联)。所以,我试图将这些数据传递到我的视图中,以便使用 从逻辑上讲,将这些数据放在模型中是有意义的。。。但是,看起来,HandlerEx


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

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

从逻辑上讲,将这些数据放在模型中是有意义的。。。但是,看起来,
HandlerExceptionResolver
接口没有保存控制器在模型中设置的任何内容(其中将包含控制器必须设置的数据)

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

谢谢

首先让我总结一下: *您有一个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子句中使用它,因为它可能没有填充

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

所以总的来说,我相信你尝试了一些至少不那么明智的事情。 (如果是交叉关注点,则不应依赖于模型)


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

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

“但是,看起来HandlerExceptionResolver接口没有保存控制器在模型中设置的任何内容”,这是什么意思?我希望,您可以像对普通控制器一样,从resolveException方法返回普通ModelAndView。。。但是,如果控制器/操作在其
ModelMap
中放置了任何内容,它将丢失(因为
resolveException
将返回一个新的
Model
)。这就是我所期望的-它是否以不同的方式工作?不,它似乎按预期工作。。。但是我想将控制器在模型映射中放置的那些值持久化到视图中(因为我们可能仍然需要它们)@Ralph:我想这就是我对
resolveeption
签名的期望/期望:
resolveeption(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,异常ex,ModelMap handlerModel)
Ralph,这是一个非常好的答案,也提供了一些很好的建议/意见。我将查看SpringAOP,看看它是否适合我的需要,或者是否有其他方法可以解决我的问题。Thankspolis878:我已经使用AspectJ实现了类似的东西,但我认为您也可以使用Spring代理AOP来实现。(但是你需要接口)。
public String myControllerMethod(ModelMap myModel) {
   myModel.put(...);
   if (Math.random()<0.5) {
     throws new RuntimeException("only a example");
   }
}
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";
    }
}   
}