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)
ここで、propertyClass はイントロスペクションによって取得されます。idName は検索するプロパティの名前 (必ずしもデータベース ID ではありません) であり、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 インスタンスを介してクラスを検索しますが、それは避けたいと思います。