编辑:
我已经看过春天3号了
@ExceptionHandler
注释并将其与
方案1
下面看起来是一个相当干净的解决方案。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers
我还发现这是一本很好的读物:
http://blog.decaresystems.ie/index.php/2006/04/07/difficult-choices-in-handling-exceptions-in-enterprise-java-applications/
例如,假设我有一个允许用户购买书籍的页面。他们在JSP上单击“购买”,控制器调用服务来实现这一切。。。现在,如果服务发现他们没有足够的资金,会发生什么?我如何将此消息返回到JSP,以便向用户显示一条漂亮的“资金不足”消息?我考虑过两种方法,但我不确定哪一种是正确的。。。
备选案文1:例外
我想到的第一种方法是在服务层引发异常,在控制器中捕获它,并向BindingResult添加一条消息。
服务:
public void pay(Book book) throws InsufficientFundsException {
// Some logic goes here, which ends up throwing the above exception
}
控制器:
public ModelAndView(@ModelAttribute("book") Book book, BindingResult errors) {
try {
pay(book);
} catch (InsufficientFundsException ex) {
errors.reject("insufficient.funds");
}
return new ModelAndView(blahblahblah);
}
选项2:将BindingResult传递到服务层
第二种方法是将BindingResult对象传递给服务层,并针对它引发更多错误。
服务:
public void pay(Book book, BindingResult errors) {
// User has insufficient funds, so...
errors.reject("insufficient.funds);
}
我可以看出这两种方法都有问题。选项1感觉很尴尬,因为我不仅要捕获异常,还要将错误添加到绑定结果中,这样就好像我做了两次同样的事情。选项2似乎将服务层与控制器绑定得太紧。
最后
SimpleMappingExceptionResolver
这可以与选项1一起使用,但我不确定它是否合适(也许我还没有看到合适的示例?)。在上面的例子中,为了论证起见,我希望用户返回到原始表单,表单上方有一个红色错误,而不是重定向到完全不同的页面。在我看来,SimpleMappingExceptionResolver在引发某个异常时(我不太想知道如何做)希望将用户重定向到标准错误页时非常有用。