我的项目中有一个Spring AbstractHandlerExceptionResolver
的实现。此处理程序负责处理从控制器抛出的所有异常。在大多数情况下,这非常适用于处理我们的特殊情况并将它们转换为Views / HTTP响应。
但是,我们要求必须在每种情况下(甚至错误)将某些内容写入响应头。必须在控制器操作本身中配置/设置此数据(因为它与控制器正在执行的操作相关联)。所以,我正在尝试将这些数据传递给我的视图,以便可以使用它。
逻辑上,将此数据放入模型中是有意义的...但是,看起来HandlerExceptionResolver
接口不会保留Controller在模型中设置的任何内容(包含控制器必须包含的数据)组)。
有没有办法在HandlerExceptionResolver
实施中访问Controller的模型值?
谢谢!
答案 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";
}
}
}