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