代码之家  ›  专栏  ›  技术社区  ›  Ben J

将错误从服务层传递回视图

  •  8
  • Ben J  · 技术社区  · 16 年前

    编辑: 我已经看过春天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在引发某个异常时(我不太想知道如何做)希望将用户重定向到标准错误页时非常有用。

    1 回复  |  直到 16 年前
        1
  •  4
  •   TofuBeer    16 年前

    Java使用异常来自然地处理这类事情。最后,它通常会简化你的逻辑,并通过忘记检查某个东西是否有错误来减少犯错误的机会。您还可以将错误逻辑移出代码的主流程。

    我不明白为什么你提出的情况不同于我将使用异常处理来处理错误的任何其他情况。