Я пытаюсь динамически создавать объекты домена в Grails и сталкивался с проблемой, что для любого свойства, ссылающегося на другой объект домена, метапроцесс говорит мне, что его тип - это "java.lang.Object", а не ожидаемый тип.
Например:
class PhysicalSiteAssessment {
// site info
Site site
Date sampleDate
Boolean rainLastWeek
String additionalNotes
...
- это начало класса домена, который ссылается на другой класс домена "Сайт".
Если я попытаюсь динамически найти типы свойств для этого класса, используя этот код (в службе):
String entityName = "PhysicalSiteAssessment"
Class entityClass
try {
entityClass = grailsApplication.getClassForName(entityName)
} catch (Exception e) {
throw new RuntimeException("Failed to load class with name '${entityName}'", e)
}
entityClass.metaClass.getProperties().each() {
println "Property '${it.name}' is of type '${it.type}'"
}
то результат состоит в том, что он распознает классы Java, но не класс домена Grails. Вывод содержит следующие строки:
Property 'site' is of type 'class java.lang.Object'
Property 'siteId' is of type 'class java.lang.Object'
Property 'sampleDate' is of type 'class java.util.Date'
Property 'rainLastWeek' is of type 'class java.lang.Boolean'
Property 'additionalNotes' is of type 'class java.lang.String'
Проблема заключается в том, что я хотел бы использовать динамический поиск для поиска совпадающих объектов, например. сделать
def targetObjects = propertyClass."findBy${idName}"(idValue)
где свойствоClass извлекается с помощью интроспекции, idName - это имя свойства для поиска (не обязательно идентификатор базы данных), а idValue - это значение, которое нужно найти.
Все заканчивается на:
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static java.lang.Object.findByCode() is applicable for argument types: (java.lang.String) values: [T04]
Есть ли способ найти фактический класс домена для свойства? Или, может быть, какое-то другое решение проблемы поиска экземпляра класса домена, тип которого не указан (только имя свойства, которое имеет тип)?
Это работает, если я использую соглашение о том, что имя типа является именем свойства, заглавным ( "сайт" → "Сайт" ), чтобы искать класс через экземпляр grailsApplication, но я хотел бы избежать этого.