2011-05-25 5 views
0

Je suivais une mention tutoriel sur code.google, mais mon exemple tombe en panne donnant la trace suivante:Morphia-MongoDB - « S'il vous plaît remplacer cette méthode pour l'utilisateur marqué entité de champ Id »

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at com.google.code.morphia.mapping.MappedClass.callLifecycleMethods(MappedClass.java:323) 
    at com.google.code.morphia.mapping.Mapper.toDBObject(Mapper.java:371) 
    at com.google.code.morphia.DatastoreImpl.entityToDBObj(DatastoreImpl.java:674) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:722) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:802) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:796) 
    at models.com.vlist.activity.classes.TestMongoData.testUserData(TestMongoData.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.code.morphia.mapping.MappedClass.callLifecycleMethods(MappedClass.java:304) 
    ... 28 more 
Caused by: java.lang.UnsupportedOperationException: Please override this method for user marked Id field entity: models.com.vlist.activity.classes.User 
    at play.modules.morphia.Model.setId_(Model.java:284) 
    at play.modules.morphia.Model.generateId_(Model.java:299) 
    ... 33 more 

Mon exemple est le suivant:

import javax.persistence.Entity; 

import org.bson.types.ObjectId; 

import com.google.code.morphia.Datastore; 
import com.google.code.morphia.Morphia; 
import com.google.code.morphia.annotations.Id; 

import play.modules.morphia.Model; 

@Entity 
public class User extends Model { 

    @Id ObjectId id;  
    private String firstName; 
    private String lastName; 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getFirstName(){ 
     return firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 
} 

et

import static org.junit.Assert.*; 

import org.junit.Test; 

import com.google.code.morphia.Datastore; 
import com.google.code.morphia.Morphia; 

public class TestMongoData { 

    @Test 
    public void testUserData() { 
     User user = new User(); 
     user.setFirstName("first"); 
     user.setLastName("last"); 

     Morphia morphia = new Morphia(); 
     Datastore ds = morphia.createDatastore("testData"); 
     ds.save(user); 

    } 
} 

Quoi de mal?

Mise à jour: Lorsque j'utilise play test, je vois ce qui suit:

08:01:55,783 ERROR ~ 

@66h1bm10d 
Internal Server Error (500) for request GET /@tests 

Compilation error (In {module:morphia}/app/morphia/Filter.java around line 8) 
The file {module:morphia}/app/morphia/Filter.java could not be compiled. Error raised is : The type Filter is already defined 

play.exceptions.CompilationException: The type Filter is already defined 
    at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:246) 
    at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:672) 
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:516) 
    at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:278) 
    at play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:406) 
    at play.Play.start(Play.java:453) 
    at play.Play.detectChanges(Play.java:574) 
    at play.Invoker$Invocation.init(Invoker.java:186) 
    at Invocation.HTTP Request(Play!) 

Répondre

5

Le problème vient de votre définition @Entity. Vous utilisez l'annotation JPA alors que vous devriez utiliser les annotations Morphia. Au démarrage, le plugin Morphia récupèrera toutes les classes marquées par l'annotation Entité morphique et les enrichira de diverses méthodes de modélisation par injection. Vous recevez cette exception car votre classe de modèle n'a pas été améliorée.

0

Essayez de retirer le @Id ObjectId id; de votre modèle. Le Morphia Module for Play Framework ajoutera l'identifiant pour vous.

Ensuite, rendez les champs publics et supprimez les méthodes getter/setter.

public String firstName; 
public String lastName; 

De plus, l'importation de votre entité est incorrecte. Essayez cette

import com.google.code.morphia.annotations.Entity; 

Essayez ceci pour un test:

import static org.junit.Assert.*; 

import org.junit.Test; 
import play.test.UnitTest; 

public class TestMongoData extends UnitTest { 

    @Test 
    public void testUserData() { 
     User user = new User(); 
     user.setFirstName("first"); 
     user.setLastName("last"); 

     user.save(); 
    } 
} 
+0

J'ai essayé de supprimer @Id ObjectId id; mais toujours la même erreur :( – daydreamer

+0

@daydreamer Voir ma réponse éditée Essayer de rendre les champs publics – Ryan

+0

@daydreamer Vérifiez également l'importation d'entité – Ryan

0

Il semble que vous ayez défini le module morphia dans le fichier de dépendance et dans le fichier de configuration de l'application.

Dans les dépendances fichier: - Lecture -> morphia [1.2.1beta6,)

Dans le fichier d'application conf: module.morphia = $ {} play.path/modules/morphia

Vous devez a supprimé une de cette déclaration sinon le module morphia est chargé deux fois ...

1

Si vous annotez @Id alors jouer à morphia n'améliorera pas votre modèle en fournissant une bonne implémentation pour la méthode void setId_ (Object ID). Essayez de définir vous-même comme ça.

@Entity 
class User extends Model { 
    @Id String email; 

    protected void setId_(Object id) { 
    } 
} 
Questions connexes