struts动作类和业务服务层

问题描述:

我在处理服务层上完成的“业务验证”时遇到问题。下面的代码显示了一个典型的账户资金转账示例,该账户资金证明资金充足,转账金额小于定义的限额。struts动作类和业务服务层

在这个例子中,调用者必须处理并捕获Action类中定义的异常,并使用相应的ActionError来显示错误消息。

对所有业务验证使用异常是“必须的”吗?

如果我决定不为此使用异常,我必须在某种意义上定义业务层(违反耦合/内聚)规则中相应的ActionError。

应该如何处理由服务层传播的消息返回到Action类?

public void transfer(String fromAccount, String toAccount, double amount) throws InsufficientFundsException, TransferLimitException, FactoryException { 
    try { 
     Account from = getAccountHome().findByPrimaryKey( 
new AccountKey(fromAccount)); 
     Account to = getAccountHome().findByPrimaryKey( 
new AccountKey(toAccount)); 
     if (from.getBalance() < amount) 
      throw new InsufficientFundsException(); // Add action errors 

     if (from.getTransferLimit() > amount) 
      throw new TransferLimitException(); // Add action errors 
     to.deposit(amount); 
     from.withdraw(amount); 
    } catch (Exception e) { 
     throw new FactoryException( 
"cannot perform transfer. Nested exception is " + e); 
    } 
} 
+0

除了我的回答,只是一个关于你的代码的快速观察。 [你不应该使用'double'来进行财务操作,因为你精确度不高。 'BigDecimal'更适合这种类型的交易](http://*.com/questions/3730019/why-not-use-double-or-float-to-represent-currency)。 – Bogdan 2012-04-16 15:36:24

你的企业应该在模型中处理,并在业务逻辑中遇到的任何问题应被传播给调用者,在这种情况下是Struts的Action类。

但你不想夫妻您的Struts类(动作,ActionForm中,ActionError,ActionMessage的等)与型号,所以你基本上通知任何问题的来电者的方式有两种:

  • 回报一些调用者可以检查的错误代码;
  • 抛出调用者可以捕获的一些异常。

喜欢使用异常,因为它们可以被掀翻在顶层从任何业务层内,无论在执行链有多深。这样就可以保持业务代码的清洁,因为不必像第一种方法那样冒出错误代码。

这些异常将被Action类捕获,Action类会将它们转换为ActionError对象以显示在视图中。只要确保你不过分,最终得到throwing the kitchen sink,否则你的Action类会变得拥挤过度的try-catch块。另外,您可以让异常传播并创建某种类型的exception handler,捕获从下面抛出的所有异常,并根据异常类型重定向到适当的视图。