在Grails 3.x项目中,我有一个命令对象HabitatCommand
,它有一个参数化的动物集合:
class HabitatCommand {
Set<Animal> animals = []
}
Animal
是一个抽象类,有许多具体的动物类:
abstract class Animal {
String name
Integer height
Integer weight
}
class Bird extends Animal {
Integer wingspan
}
class Cat extends Animal {
Integer lives
}
如果我们只是从现有动物中选择并提交它们的ID(就像你从下拉列表中那样),我确信数据绑定工作正常,但是当尝试在表单中创建新的动物实例时会出现问题。采取以下表格数据:
animals[0].name: 'animal1'
animals[0].height: 4
animals[0].weight: 75
animals[0].wingspan: 7
animals[1].name: 'animal2'
animals[1].height: 3
animals[1].weight: 45
animals[1].lives: 9
发生数据绑定时,Grails遍历每个animals[i]
索引表单属性,并尝试创建参数化类型的新实例,在本例中为Animal
。这不起作用,因为Animal是一个抽象类,我希望能够根据请求参数自定义该功能以创建正确的具体Animal实例,例如wingspan
属性存在,我们想要创建Bird
的实例。
换句话说,如何挂钩数据绑定过程以指定创建每个动物实例时要使用的具体类?
这可能吗?我尝试过使用自定义设置器[].withDefault {}
,@BindUsing
和自定义ValueConverter
,但我不相信任何适用于此情况的设置器都不适用于解决方案甚至被引用。