Grails 3 не возвращает правильный класс

У меня есть код Grails/Groovy, первоначально разработанный для Grails 2, и мы недавно провели рефакторинг для Grails 3. Работая в Intellij IDEA (и на нашем сервере Tomcat), исходный объект, являющийся DocumentSource, не идентифицируется как таковой. Вместо этого он идентифицируется как базовый исходный класс. Этот код вернул ожидаемые результаты в Grails 2, но поставил меня в тупик в Grails 3.

При проверке исходного объекта в отладчике поля верхнего уровня пусты для типа и профиля, а метакласс является источником. В разделе target->handler находятся ожидаемые значения для типа, профиля, documentId, documentName и метакласса.

Я не уверен, связано ли это с GORM/Hibernate. Мы экспериментировали с использованием другой версии, и я не уверен, что это повлияет. Любые идеи?

// Base Domain Class
class Source {
    String type
    Profile profile
}

// Extended Domain Class
class DocumentSource extends Source {
    String documentId
    String documentName
}

// Further Extended Domain Class
class DocumentLocatorSource extends DocumentSource {
    String locatorId
}

// Snippet from Service Class
...
sourceReferences.each { sourceReference ->
    def source = sourceReference.source
    MarshalledResponse response = new MarshalledResponse()
    response.sourceId = source.id
    if(source instanceof Source) {
        // Get's here!
        cdsSource.sourceId = source.id
    }
    if(source instanceof DocumentSource) {
        // Never get's here. :-(
        response.documentid = ((DocumentSource)source).documentId
        response.documentname = ((DocumentSource)source).documentName
    }
    if(source instanceof DocumentLocatorSource) {
        response.locatorid = ((DocumentLocatorSource)source).locatorId
    }
}
...

person GeoGriffin    schedule 23.08.2017    source источник
comment
Что делать, если вы используете source.instanceOf(DocumentSource)?   -  person doelleri    schedule 23.08.2017
comment
Ага! Это работает! Пинговал коллегу после того, как я опубликовал это, и он видел это раньше, и мы работали над этим. Я работал над другим несвязанным кодом, пытаясь найти правильные версии GORM, и я думаю, что это было введено между Hibernate4 и Hibernate5. Кажется, это дублирующий вопрос для stackoverflow.com/questions/ 35896648/   -  person GeoGriffin    schedule 23.08.2017
comment
Исходный код использовал source.class и, похоже, страдает от той же проблемы. Есть ли аналогичный обходной путь для instanceOf() для класса?   -  person GeoGriffin    schedule 23.08.2017
comment
Я говорил слишком рано. Позже он взрывается, когда невозможно преобразовать объект «com.mycompany.myproject.DocumentSource: 2811459» с классом «com.mycompany.myproject.Source_$$_jvst55c_28» в класс «com.mycompany.myproject.DocumentSource».   -  person GeoGriffin    schedule 23.08.2017
comment
Можете ли вы достичь желаемых полей без кастинга? Не похоже, что это необходимо, если только вы не ввели переменную статически.   -  person doelleri    schedule 23.08.2017
comment
Попытка: response.documentid = source.documentId, я получаю: Нет такого свойства: documentId для класса: com.mycompany.myproject.DocumentSource Возможные решения: documentId   -  person GeoGriffin    schedule 23.08.2017
comment
Попытка: response.documentid = (источник как DocumentSource).documentId, я получаю: com.mycompany.myproject.Source_$$_jvst627_2a не может быть приведен к com.mycompany.myproject.DocumentSource   -  person GeoGriffin    schedule 23.08.2017
comment
Кроме того, похоже, что у меня есть 35 экземпляров instanceof в моем коде Groovy. Около трети из них предназначены для примитивов Java, так что я, вероятно, в порядке, но остальные, вероятно, придется изменить.   -  person GeoGriffin    schedule 23.08.2017
comment
Мне пришлось изменить исходное назначение на def source = GrailsHibernateUtil.unwrapIfProxy(sourceReference.source), тогда я мог использовать экземпляр Java, а также приведение   -  person GeoGriffin    schedule 24.08.2017