Playframework, conversión de JSON a modelo (con Gson), error al guardar el modelo

Estoy tratando de convertir una cadena JSON en mi clase modelo. Estoy usando morphia dentro del marco de juego.

Aquí están las líneas de código relevantes:

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(); 

Pero creo que estoy haciendo algo mal, porque este código arroja la siguiente excepción:

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

Parece que la siguiente línea está lanzando esta excepción:

bookmark.save();

Aquí está el código del modelo:

@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;
    }
}

Mi pregunta ahora es cómo puedo solucionar esto o cómo tengo que crear una instancia de modelo basada en la entrada json.

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

Está arrojando un error porque fromJson () solo acepta String or Reader objetos, estás pasando en un JsonObject.

Pero porque ¡Juega! usos Encuadernación POJO probablemente sea mejor hacer algo como:

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

Si realmente quieres trabajar con Gson, entonces algo como esto podría funcionar (basado en mirar los 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(); 
}

respondido 09 mar '12, 19:03

Bien, probé la segunda solución pero realmente no funciona. Las llamadas a add() siempre daban como resultado "no se puede serializar la clase java.lang.Object". Así que ahora estoy usando algo como un "camino medio"... un objeto de "traducción" con los mismos atributos que mi modelo. Uso este objeto para llenarlo con los datos json y luego creo un modelo basado en ese objeto. ... eso funciona para mí ... tal vez no sea la mejor/elegante manera, pero por el momento funciona. - Marc

De todos modos, su consejo sobre JsonObject->toJson fue útil. - Marc

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.