【问题标题】:how to handle multiple return types in groovy Mehods?如何在 groovy 方法中处理多种返回类型?
【发布时间】:2012-04-26 04:05:25
【问题描述】:

我需要有一个方法来在成功的情况下返回 Id,在失败的情况下返回错误列表。 前代码 sn-p:

def save = {
   def errors = []
    if(Employee.save(flush:true)){
      return Employee.id
    }else{
      errors.add("Can't be saved")
      return errors.
    }

   } 

在服务类中 呼叫 Employee.save() - .. 那么如何检查 save 方法返回的是错误还是 id

如有任何建议,我们将不胜感激。

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    我同意 Burk 不要返回不同的类型,这可能会导致意外错误。 该问题的另一个解决方案是使用 Java 的异常处理机制。您可以将上下文字段添加到将保存验证错误列表的异常。捕获异常后,您可以提取错误。

    void save(Employee employee) {
        // do save
        // ...
    
        // on error:
        def errors = [ "terrible error nr. 5" ]
        throw new ValidationException(errors)
    }
    
    
    try {
        fooService.save(employee)
    } catch(ValidationException e) {
        def errors = e.erorrs
        // do stuff with the errors
    }
    

    另一个优点:当没有验证错误预期时,可以在 Groovy 中省略 try-catch 块,这使代码更简洁,因为您不必关心任何验证错误字段。

    【讨论】:

      【解决方案2】:

      不要这样做——即使你可以让它在 Groovy 中更有用,这也是个坏主意。不过,在这种情况下,有一些简单的解决方案。如果您只是传递 Employee 实例并将其保存在 service 方法中,则无需返回任何内容:

      void save(Employee employee) {
         employee.save(flush:true)
      }
      

      这是因为如果成功,id 会在你传入的实例上设置,如果没有,errors 属性中会出现一个或多个验证错误(你不需要返回一般错误实际有用的错误消息可用时的消息)。

      例如,这将是您在控制器中调用服务的代码:

      def employee = new Employee(...)
      fooService.save(employee)
      if (employee.hasErrors()) {
         // do something with employee.errors
      }
      else {
         // success - use the id if you need via employee.id
      }
      

      如果你想传入数据来创建和保存新实例并返回一个Employee(这是我通常采取的方法),类似:

      Employee save(String name, int foo, boolean bar, ...) {
         Employee employee = new Employee(name: name, foo: foo, bar: bar, ...)
         employee.save(flush:true)
         return employee
      }
      

      在第二种情况下,将save 调用和return 分开很重要,因为如果出现验证错误,save 将返回null,并且您希望始终返回一个非空实例。所以不要这样做:

      return employee.save(flush:true)
      

      如果将它们分开,您可以检查错误和/或 id。

      另外,请确保不要像在代码中那样在服务中使用闭包 (def save = { ...)。只有方法是事务性的,因为 Spring 事务处理不知道 Groovy 闭包——它们只是 Groovy 调用的字段,就好像它们是方法一样,但它们不是。

      【讨论】:

      • Burt:我明白你在说什么,但我必须返回自定义错误,并且因为我正在处理 web 服务,所以我不能对域进行验证,所以我可以将列表错误作为保存方法的一部分传递。就像在 Service def errors = [] ; service.save(id,name,no,errors)..so 因为errors是一个列表对象,不需要返回。
      • 我建议打印错误以从服务中记录。除此之外,我完全同意。
      • 如果您绝对需要返回自己的错误,请使用 Map 或专用的结果对象。作为地图:[id:employee.id,errors:myErrors]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2016-04-20
      相关资源
      最近更新 更多