2012-03-09 2 views
1

Je tente de convertir une chaîne JSON dans ma classe de modèle. J'utilise la morphine dans le cadre de jeu.Playframework, Conversion de JSON en modèle (avec Gson), échec de l'enregistrement du modèle

Voici les lignes pertinentes du code:

public static void add(JsonObject body) { 
    System.out.println(body); // -> {"title":"test2","url":"http://www.gmx.de","description":"eine beschreibung für das lesezeichen","tags":["tag1","tag2","tag3","tag5","tag0209135913598"],"is_private":true} 
    Gson gson = new Gson(); 
    Bookmark bookmark = gson.fromJson(body, Bookmark.class); 
    System.out.println(bookmark.getClass().getName()); // -> models.Bookmark  
    bookmark.save(); 

Mais je pense que I'am quelque chose de mal, parce que ce code génère l'exception suivante:

Execution exception (In /app/controllers/Bookmarks.java around line 40) 
IllegalArgumentException occured : can't serialize class java.lang.Object 

play.exceptions.JavaExecutionException: can't serialize class java.lang.Object 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231) 
    at Invocation.HTTP Request(Play!) 
Caused by: java.lang.IllegalArgumentException: can't serialize class java.lang.Object 
    at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:234) 
    at org.bson.BSONEncoder.putIterable(BSONEncoder.java:259) 
    at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:198) 
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:140) 
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:86) 
    at com.mongodb.OutMessage.putObject(OutMessage.java:190) 
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:253) 
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:217) 
    at com.mongodb.DBCollection.insert(DBCollection.java:71) 
    at com.mongodb.DBCollection.save(DBCollection.java:633) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:764) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:826) 
    at com.google.code.morphia.DatastoreImpl.save(DatastoreImpl.java:820) 
    at play.modules.morphia.Model.save2(Model.java:705) 
    at play.modules.morphia.Model.save(Model.java:692) 
    at controllers.Bookmarks.add(Bookmarks.java:40) 
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
    ... 1 more 

Il semble que le la ligne suivante lance cette exception:

bookmark.save(); 

Voici le code du modèle:

@AutoTimestamp 
@Entity 
public class Bookmark extends Model { 
    public String title; 
    public String url; 
    public String description; 
    @Indexed 
    public List tags; 
    public boolean is_private; 

    public Bookmark() {} 

    public Bookmark(String title, 
        String url, 
        String description, 
        List tags, 
        boolean is_private) 
    { 
     this.title   = title; 
     this.url   = url; 
     this.description = description; 
     this.tags   = tags; 
     this.is_private  = is_private; 
    } 
} 

Ma question est maintenant comment je peux résoudre ce problème, ou comment je dois créer une instance de modèle basé sur l'entrée JSON?

Répondre

0

Il lance une erreur car fromJson() n'accepte que les objets String ou Reader, vous passez dans un JsonObject.

Mais parce que Play! utilise POJO binding il est probablement préférable de faire quelque chose comme:

public static void add(Bookmark newBookmark) { 
    // Validation etc .. 
    bookmark.save(); 
} 

Si vous voulez vraiment travailler avec Gson alors quelque chose comme cela pourrait fonctionner (basé sur la recherche à the docs):

public static void add(JsonObject body) { 
    Gson gson = new Gson(); 
    String json = gson.toJson(body, Bookmark.class); 
    Bookmark bookmark = gson.fromJson(json, Bookmark.class); 
    bookmark.save(); 
} 
+0

D'accord, j'ai essayé le deuxième solution mais ça ne marche pas vraiment. Les appels à add() ont toujours abouti à "ne peut pas sérialiser la classe java.lang.Object". Donc j'utilise maintenant quelque chose comme un "moyen" ... un objet "translation" avec les mêmes attributs que mon modèle - j'utilise cet objet pour le remplir avec les données json puis je crée un modèle basé sur cet objet. .. cela fonctionne pour moi ... peut-être pas la meilleure/façon élégante - mais pour le moment cela fonctionne. – Marc

+0

En tout cas, votre astuce à propos de JsonObject-> toJson était utile. – Marc

Questions connexes