grails - 您使用动态 Groovy 功能​​做什么?

标签 grails groovy

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




在开发 Grails 应用程序时,我没有进行任何元类编程或(明确地)利用 Groovy 的任何动态特性。我觉得我错过了。您能否举例说明您在 Grails 项目中何时/何时/如何使用 Groovy 的动态特性(是否向域中添加方法,例如 Controller )?

最佳答案

不是 Grails 项目,但我在 JBoss Seam 项目中工作了两年,其中包含大量 Groovy 代码。我们通常有一些服务类,其第一个参数方法通常是模型类。通过类别,它们变得真正面向对象:

class InvoiceService {
  static void sendToWs(Invoice invoice, wsEndpoint) {
    // neat stuff
  }

  static void validate(Invoice invoice) throws InvoiceValidationException {
    // more neat stuff
  }

  static InternationalInvoice buildInternationalInvoice(Invoice invoice) {
    // builds new object
  }
}


def invoice = new Invoice()

use(InvoiceService) {
  invoice.validate()
  invoice.sendToWs endpoint
}

我相信这同样适用于 Grails。

我们还构建了很多位置文本文件,并且我们在类别下使用了很多 groovy 方法:
class PositionalFormatCategory {
  static String pad(String value, Integer times) {
    value.trim().padRight times, " "
  }
  static String pad(BigDecimal value, Integer times) {
    value.toString().padLeft times, " "
  }
}

但是Groovy 在解析/编写XML 方面确实令人震惊。我们有一个模型类,必须转换为 4 种不同的 XML 格式
class XmlFormat1 {
  ServiceInvoice invoice

  String toXml() {
    new StreamingMarkupBuilder().bind {
      xml {
        price invoice.value
        date invoice.creationDate
        invoice.items.each { item ->
          invoiceItem {
            price item.price
            quantity item.qty
          }
        }
      }
    }
  }
}

我们使用元编程来 Hook 一个小的 lib 方法,该方法连接到一个可能已关闭的 rest 服务(我不记得 lib 名称)。我们使用它来定义超时,否则它会花一整天时间而不会失败:
def oldConnect = RestConn.metaClass.&connect
RestConn.metaClass.connect = {
  try {
    delegate.setTimeout 5000
    oldConnect()
  } catch (TimeoutException t) {
    throw new BusinessException("Timeout connecting to the server")
  }
}

难以击败:-)

关于grails - 您使用动态 Groovy 功能​​做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677955/

相关文章:

grails - Grails应用程序索引页面URL

grails - grails 服务的首字母应该大写还是小写?

Jenkins DSL 语法 : Run Periodically With Parameters

git - 如何 checkin 文件以使用 git 构建?

eclipse - 如何使用Mongo为Birt编写表达式?

json - Grails : How to access the params coming as JSON format

java - Groovy 中的显式输入 : sometimes or never?

maven - 从 Maven 执行外部 groovy 脚本

grails - Spring Security 3.0.3-如果在插件或子插件中定义YML安全配置将不起作用

grails - Grails搜索 map