编辑:我研究了 Spring 3 的 @ExceptionHandler
注释,并将其与下面的选项 1 相结合看起来是一个非常干净的解决方案。
我使用 Spring MVC 框架进行开发已经有一段时间了,但是我正在努力想出一种“不错”的方法来将服务层中出现的错误传递回 JSP。
基本上,我不认为业务逻辑(除了“此字段是必需的”)应该在 validator 中,尤其是任何需要访问数据库的逻辑。所以,我一直在做的是在服务层放置更进一步、更复杂的验证和业务逻辑。
例如,假设我有一个允许用户购买书籍的页面。他们单击 JSP 上的“购买”, Controller 调用服务以实现这一切......现在,如果服务发现他们没有足够的资金会发生什么 - 我如何将此消息返回给 JSP 这么好一点可以向用户显示“资金不足”信息吗?我考虑了两种方法,但我不确定哪种方法是正确的...
选项 1:异常(exception)情况
我想到的第一种方法是在服务层引发异常,将其捕获在 Controller 中并向 BindingResult 添加一条消息。
服务:
public void pay(Book book) throws InsufficientFundsException {
// Some logic goes here, which ends up throwing the above exception
}
Controller :
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 感觉很尴尬,因为我不仅必须捕获异常,然后还必须将错误添加到绑定(bind)结果中,所以感觉就像我在做同样的事情两次。选项 2 似乎将服务层与 Controller 绑定(bind)得太紧。
最后,我意识到 SimpleMappingExceptionResolver
可以与选项 1 一起使用,但我不确定它是否合适(也许我还没有看到一个合适的例子?)。在上面的示例中,为了论证起见,我只说我希望用户返回原始表单并在表单上方显示红色错误,而不是重定向到一个完全不同的页面。 SimpleMappingExceptionResolver 在我看来非常有用,当您想在引发特定异常时将用户重定向到标准错误页面(这不是我想知道的操作)。
最佳答案
Java 使用异常来自然地处理这种事情。最后,它通常会简化您的逻辑并减少因忘记检查某些内容是否有错误而犯错误的机会。您还可以将错误逻辑移出代码的主要流程。
我不明白为什么您提供的案例与我会使用异常处理来处理错误的任何其他案例不同。
关于java - 将错误从服务层传回 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224749/