我的项目中有一个Spring AbstractHandlerExceptionResolver的实现。这个处理程序负责处理从控制器抛出的所有异常。在大多数情况下,这可以很好地处理我们的异常情况,并将它们转换为视图/HTTP响应。
然而,我们有一个要求,在每种情况下(即使是错误),都必须向响应头写入一些内容。此数据必须在控制器操作本身中配置/设置(因为它与控制器正在执行的任何操作相关)。因此,我正在尝试将这些数据传递到我的视图中,以便可以使用。
从逻辑上讲,将这些数据放入模型中是有意义的……但是,看起来HandlerExceptionResolver接口不会持久化控制器在模型中设置的任何内容(它将包含控制器必须设置的数据)。
有没有办法在HandlerExceptionResolver实现中访问控制器的模型值?
谢谢!
发布于 2011-04-20 01:22:31
首先让我总结一下:*你有一个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 try/catch,所以我猜您有一个奇怪的交叉关注点,那就是使用模型。为了实现它,我会使用AOP。我会为控制器方法添加一个point cut和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";
}
}
}https://stackoverflow.com/questions/5719683
复制相似问题