spring-mvc - 从应用服务层报告错误

标签 spring-mvc error-handling domain-driven-design

我正在实现基于 Spring MVC 并围绕 DDD 概念组织的 Web 应用程序。目前我尝试实现机票预订功能。客户可以看到特定事件的可用门票数量。然后,他可以输入要预订的门票数量并提交表格。请求由调用负责注册的应用程序服务的 Controller 接收。应用服务逻辑如下:

  • 验证传入参数:
  • 1A。检查给定 ID 的事件是否存在
  • 1B。检查可用票数是否允许预订
  • 如果验证通过,则继续注册;否则,报错。

  • 我对报告验证错误的正确方法有些怀疑——尤其是对于第 1B 点。门票数量不允许预订的情况并不少见。客户可以看到与数据库中当前票数不完全同步的票数(最终一致性)——其他人可以同时预订一些票。

    最初我正在考虑通过抛出一些特定的异常来报告这个问题。但是,我可以想到其他几个有问题的情况,并且为每种情况设置一个异常(exception)听起来不太好。

    我正在考虑的另一个选择是抛出一种包含错误代码的异常。但是,我不知道如何在 Spring MVC 中正确处理这种情况。

    此类问题的最佳实践是什么?您如何在 MVC 应用程序中处理它们?任何建议都非常感谢。

    最佳答案

    我认为这些是无法恢复的业务约束破坏。

    我目前的解决方案是异常层次结构。

    public abstract class UncheckedApplicationException extends RuntimeException {
    
        //omitted factory methods and constructors
        public abstract String getStatusCode();
    
        public abstract String getI18nCode();//ignore this if you don't need i18n    
    
        public abstract String[] getI18nArgs();//ignore this if you don't need i18n 
    }
    

    任何自定义异常都会扩展此异常。我认为这可以避免这样的代码:
    try {  
        //invoke your application service
    } catch (InsufficientInventoryException e) {  
        statusCode = INSUFFICIENT_INVENTORY;  
    } catch (ExpriedPriceException e) {  
        statusCode = EXPIRED_PRICE;  
    } catch (NoSuchProductException e) {  
        statusCode = NO_SUCH_PRODUCT;  
    } catch (Exception e) {  
        statusCode = UNKNOWN;  
    }
    

    Controller 代码片段:
    try {  
        //invoke your application service here 
        statusCode = SUCCESS;
        message = messageSource.getSuccess(locale));
    } catch (UncheckedApplicationException e) {  
        statusCode = e.getStatusCode();  
        message = messageSource.getMessage(e, locale));
    } catch (Exception e) {  
        statusCode = UNKNOWN;  
        message = messageSource.getUnknownError(e, locale));
    }
    //add statusCode & message to modelAttribute
    

    如果您的 Controller 组织良好(但非常困难),您可以使用 @ExceptionHandler 来减少样板的 try-catch 代码。

    使用异常的另一个原因是应用程序服务通常用于划定事务边界。如果要回滚,必须抛出异常。

    关于spring-mvc - 从应用服务层报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18069143/

    相关文章:

    visual-studio-2008 - Microsoft 增量链接器已停止工作

    java - 如何在桌面 JVM 上获得更好的 NullPointerException 消息?

    events - DDD、领域服务和事件

    domain-driven-design - 领域驱动设计库

    events - CQRS 存储库/事件发布者

    java - 在 MVC 应用程序中为 View 层使用 JSTL 与 Velocity 的好处?

    web-services - 将整数列表传递给 GET REST API

    java - Spring MVC 自定义验证消息

    mongodb - 如何设置allowDiskUse :true in spring mongoTemplate

    java - 发牌算法