2012-03-09 2 views
1

JSON 문자열을 내 모델 클래스로 변환하려고합니다. 저는 놀이 프레임 워크 내에서 모피 아를 사용합니다. 여기 Playframework, JSON을 모델로 변환 (Gson 사용), 모델 저장 실패

코드의 관련 라인은 다음과 같습니다

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

그러나이 코드는 다음과 같은 예외가 발생합니다 때문에, I'am이 뭔가 잘못하고 있다고 생각 :

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 

그것은 그런 것을 다음 줄에서이 예외가 throw됩니다.

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 입력을 기반으로 모델 인스턴스를 작성해야합니까?

답변

0

fromJson()String 또는 Reader 개의 객체 만 허용하므로 오류가 발생합니다. JsonObject으로 전달됩니다.

하지만 Play!

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

것은 당신이 정말로 (the docs보고 기준) 다음과 같은 뭔가가 작동 할 수 GSON 작업 할 경우 : 그것은 같은 것을 할 아마도 더 나은 POJO binding 사용

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

좋아요를, 내가 시도 두 번째 솔루션이지만 실제로 작동하지는 않습니다. add()를 호출하면 항상 "java.lang.Object 클래스를 직렬화 할 수 없습니다"라는 결과가 발생합니다. 그래서 저는 지금 "middle way"같은 것을 사용하고 있습니다. 제 모델과 같은 속성을 가진 "translation"객체 -이 객체를 사용하여 json 데이터로 채운 다음 해당 객체를 기반으로 모델을 만듭니다. .. 그게 나를 위해 일하는 ... 어쩌면 최고/우아한 방법이 아닐지 모르지만 - 순간적으로 효과가 있습니다. – Marc

+0

어쨌든 JsonObject-> toJson에 대한 팁이 유용했습니다. – Marc