2016-11-01 5 views
-1

Я пытаюсь использовать набор объектов «шаблона» для заполнения отношений гармонии на другом объекте, но .each не работает, как ожидает Id.Grails: «domain» этого домена не может быть принудительно применен к типу домена?

Вкратце я моделирую «Мир», который содержит несколько объектов HouseInstance. Каждый HouseInstance связан с другим существующим набором объектов HouseProto, из которых HouseInstance получает определенные функции (квадратные футы, # спальни и т. Д.)

поэтому, когда я создаю мир, у меня есть обычная процедура makeHouses, которая создает HouseInstance для каждого HouseProto и присваивает HouseProto экземпляру дома.

Вот код:

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. Я не понимаю, как это возможно (или как исправить.)

+0

Очень простая вещь, которую вы пытаетесь выполнить итерацию класса, а не набор объектов класса. –

ответ

0

HouseProto - ваш класс домена. Я полагаю, вам нужен список из HouseProto экземпляров, не так ли? Тогда:

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

Я изменил each к collect вернуть список HouseInstance.

+0

Это интересно, но я хочу знать, почему мой код разрушается. – user1023110

+1

@ user1023110 Возможно, я не понимаю ваш вопрос, извините. 'it' в вашем' each' является 'java.lang.Class', потому что вы не итерируете список экземпляров' HouseProto', а класс домена, который является 'java.lang.Class' и' hi.houseProto' нужен экземпляр «HouseProto», а не класс «HouseProto». Вот почему вы получаете ошибку 'Невозможно преобразовать значение типа '. – rvargas

+0

Да, это была ошибка. Я должен был использовать HouseProto.findAll(). – user1023110

0

Простая ошибка. Я должен был повторить HouseProto.findAll(), каждый или что-то в этом роде. Не только HouseProto.each().