2012-12-08 2 views
-1

J'ai une question assez simple sur les classes de domaine de gravier. Je ne suis pas sûr de savoir comment l'exprimer correctement puisque je n'arrive pas à trouver la réponse sur google.grails domaine class expose id pour les classes Java

J'ai une classe groovy de domaine

class DomainObject { 
    String name 
    String email 
} 

et une classe java qui utilise cet objet de domaine.

public class DomainUser { 
    public void method() { 
     DomainObject object = new DomainObject(); 
     object.getId(); 
    } 
} 

mais je reçois une erreur sur la ligne

object.getId();

avec le message :

La méthode getId() est définie pour le type

Comment exposer l'id à la classe java car il est généré automatiquement par les grails cation/hibernation?

+0

Qu'est-ce qui vous donne l'erreur? 'grails compile' ou votre IDE? Il y a beaucoup de choses semi-magiques ajoutées aux classes artefacts Grails par les transformations AST au moment de la compilation (dont getId() 'pour les classes de domaine), et si votre IDE n'est pas conscient de ces transformations, il échouera. –

+1

En outre, un commentaire de côté, Grails remplace les constructeurs de classe de domaine par le biais du mécanisme de métaclasse pour rendre les choses comme autowiring de services dans les domaines fonctionnent correctement. Donc, si vous voulez "nouveau" une classe de domaine en code Java, vous devez utiliser 'InvokerHelper.invokeNoArgumentsConstructorOf (DomainClass.class)' qui est la manière Java d'appeler le constructeur fourni par la métaclasse plutôt que le vrai. –

Répondre

1

Le champ Id est généré au moment de l'exécution et java ne sait rien des références dynamiques. Accédez à ce domaine à partir de la couche de service. http://grails.org/doc/latest/guide/services.html#usingServicesFromJava

aussi Google: "Grails accès au service java"

premier résultat est http://grails.1312388.n4.nabble.com/Question-How-do-I-reference-a-Grails-service-from-within-Java-class-td1462056.html

Vous pouvez écrire quelque chose comme ça dans votre DomainService.groovy

class DomainService(){ 
    def persistAndGetNewDomain(){ 
     new Domain().save(flush:true)  
    } 
} 

vous devez ajouter également le champ id à votre classe de domaine

class DomainObject { 
    Long id 
    String name 
    String email 
} 
Questions connexes