1

JSON文字列をモデルクラスに変換しようとしています。PlayFramework内でモルヒネを使用しています。

関連するコード行は次のとおりです。

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

しかし、このコードは次の例外をスローするため、私は何か間違ったことをしていると思います。

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

次の行がこの例外をスローしているようです。

bookmark.save();

モデルのコードは次のとおりです。

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

私の質問は、これをどのように修正できるか、またはjson入力に基づいてモデルインスタンスを作成する必要があるかどうかです。

4

1 に答える 1

0

fromJson()StringはorReaderオブジェクトのみを受け入れるため、エラーをスローしていますJsonObject

しかし、だからプレイ!POJOバインディングを使用します。おそらく次のようなことを行う方が良いでしょう:

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

本当に Gson を使用したい場合は、次のようなものが機能する可能性があります ( 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(); 
}
于 2012-03-09T19:18:32.137 に答える