gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:56 24 4
gpt4 key购买 nike


我的项目中有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com