Grails数据绑定:创建抽象类的实例

时间:2013-07-04 07:41:57

标签: grails

使用Grails时,我喜欢尽可能依靠自动数据绑定和脚手架。我有以下问题。我有一个域类Flow,它有一个Domain类Node实例的集合,是最新的一个抽象类:

class Flow {
    List nodes
    static hasMany = [ nodes: Node]
    static constraints = { nodes minSize:1 }
}
abstract class Node {
    String title
    static belongsTo = [ ownerFlow: Flow]
}

有几个类继承自Node。尝试使用数据绑定创建Flow时,以下集成测试失败:

void "a flow can be created from a single request using the default grails data binding"() {
  when:
    def controller = new FlowController()
    controller.request.addParameters(['nodes[0].title': 'First step'])
    new Flow(controller.params).save(flush:true)
  then:
    Flow.count() > 0
  }
}

当我将Node从抽象更改为非抽象时,测试通过。它完全有道理,因为Grails无法创建node [0]实例,因为Node是一个抽象类,但问题是:

  • 有没有办法指定节点的具体类,以便可以创建它?

技术上完全可能(实际上Grails已经在使用类名列来持久化和检索实例),但是我不确定数据绑定中是否已经考虑过这种情况。如果不是:

  • 如果不触及控制器,您认为最佳解决方案是什么?

1 个答案:

答案 0 :(得分:6)

您需要为绑定目的配置默认值:

List nodes = [].withDefault { new MyConcreteNode() }