Grails:domain.each的'it'不能被强制转换为域名类型?

时间:2016-11-01 09:58:09

标签: grails gorm

我正在尝试使用一组“模板”对象来填充另一个对象上的和声关系,但是.each不能像我期望的那样工作。

简单地说,我正在建模一个包含许多HouseInstance对象的“World”。每个HouseInstance都与另一个已存在的HouseProto对象相关联,HouseInstance从中获取某些特征(平方英尺,卧室数等)。

因此,当我创建一个World时,我有一个makeHouses例程,为每个HouseProto创建一个HouseInstance,并将HouseProto分配给house实例。

以下是代码:

class World {
    static hasMany=[houses: HouseInstance]
    static constraints = {
    }

    void makeHouses() {

        HouseProto.each {
            def hi=new HouseInstance();
            hi.houseProto=   it;
            hi.world=this;

        }
    }
}

class HouseInstance {
    Neighborhood neighborhood

    static belongsTo=[houseProto: HouseProto, world: World]


    static constraints = {
    }
}

所以我创建了几个“HouseProto”对象,然后运行以下代码:

def w= new World()
w.makeHouses()

这导致在makeHouses中的行发生类型强制错误,我尝试将HouseProto对象分配给HouseInstance对象。

 hi.houseProto=   it;

'它'当然应该是一个HouseProto实例,因为它是由Domain类上的每个方法实例化的。不过我收到了错误:

Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.Class] to required type [com.grapevine.negotiator2.HouseProto] for property 'houseProto': no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:306)

似乎告诉我'它'不是HouseProto,而只是一个非特定类型的java.lang.Class,它不能被强制转换为HouseProto。我不明白这是怎么可能的(或如何解决。)

2 个答案:

答案 0 :(得分:0)

HouseProto是您的域类。我想你需要一个HouseProto实例列表,对吗?然后:

HouseProto.list().collect {
    new HouseInstance(houseProto:it, world:this)
}

我将each更改为collect以返回HouseInstance列表。

答案 1 :(得分:0)

简单的错误。我应该迭代HouseProto.findAll()。每个或类似的东西。不只是HouseProto.each()。

相关问题