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

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


我的项目中有一个 Spring AbstractHandlerExceptionResolver 的实现。此处理程序负责处理从 Controller 抛出的所有异常。在大多数情况下,这在处理我们的异常情况并将它们转换为 View /HTTP 响应方面非常有效。

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

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

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

谢谢!

最佳答案

我先总结一下: * 你有一个 MVC Controller 方法 * 如果在这个 Controller 方法中有异常,那么你想拿模型做一些不同的事情(然后在没有异常的时候)

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

public ModelAndView myController() {
    Model model = new Model();
    model.put(...); 
    try {
       ...
       return new ModelAndView("success", model);
    } catch (SomethingWrongException e) {
       return new ModelAndView("failure", model);   
    }        
}

您可能已经注意到 try block 不包含模型总体。 - 因为如果它在 try block 中,你不应该在 catch 子句中使用它,因为它可能没有被填充。

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

try {
   ModelAndView modelAndView = invoke.myController()
} catch (Exception e) {
   doSomethingWith(modelAndView);
}

所以总的来说,我相信您会尝试一些至少不太可取的事情。 (如果是横切关注点,则不应该依赖于模型)


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

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

因为您要使用 HandlerExceptionResolver 而不是具体的 try/catch 我猜您有一个使用模型的奇怪的横切关注点。为了实现它,我会使用 AOP。我会为 Controller 方法添加切点和环绕建议,如果抛出异常,它们会返回另一个 View 名称。

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

关于java - 如何从 Spring 中的 HandlerExceptionResolver 访问模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719683/

相关文章:

java - .class 我的程序的预期错误

javascript - BackboneJS View 更新

java - Netty 客户端的 MVC 前端

java - 使用Dao和Bean类通过MVC模型将数据插入数据库

java - 从自定义类获取 spring 配置值

javascript - 使用 Java 的 AES-256-GCM 解密中的标签不匹配错误

java - 在 jsp 中创建联系表单?

java - POS:如何将每件商品的价格相加得出总价?

mysql - 实体管理器超时

java - spring mvc中如何获取方法请求