JsonMappingException:如何通过Restlet传输Objectify Entity(with Key)

时间:2012-08-15 11:31:24

标签: json restlet objectify restlet-2.0

我正在开发一个Android应用程序,与GAE服务器+ Objectify DB通信。

我选择Restlet作为休息框架。

当我尝试使用Key属性检索实体时遇到问题。服务器抛出错误:

org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle
(through reference chain: java.util.ArrayList[0]->com.my.model.MyMessage["senderKey"]->com.googlecode.objectify.Key["root"])

这是我的模型(非常简单):

public class MyMessage implements Serializable {
private static final long serialVersionUID = -1075184303389185795L;

@Id
private Long id;

@Unindexed
private String sendMessage;

@Parent
Key<MyUser> senderKey;

private MyMessage() {
}

public MyMessage(MyUser user, String message) {
    super();
    this.sendMessage = message;
    this.senderKey = new Key<MyUser>(MyUser.class, user.getId());
}

[... getters and setters ...]
}

public class MyUser implements Serializable {

private static final long serialVersionUID = 7390103290165670089L;
@Id private String id;

private MyUser() {
    this.setId("default");
}

public MyUser(String mail) {
    this.setId(mail);
}
[... getters and setters ...]

}

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

Objectify的Key有一个方便的方法getRoot(),它返回祖先链中的根元素。当键 根时,getRoot()会返回。杰克逊将此视为一个循环,因此您会收到错误。

处理此问题的最佳方法是不要尝试将Keys序列化为json对象。密钥在JSON中更好地表示为字符串化版本。

我不知道你在Restlet中是如何做到这一点的,但你需要修改ObjectMapper实例以提供执行此转换的KeySerializer。请查看Objectify4中的ObjectifyJacksonModule获取指导:

https://code.google.com/p/objectify-appengine/source/browse/src/com/googlecode/objectify/util/jackson/ObjectifyJacksonModule.java

答案 1 :(得分:0)

你有没有

<inherits name="com.googlecode.objectify.Objectify" />
你的GWT模块中的

答案 2 :(得分:0)

我遇到了类似的问题导致了这个确切的错误。将代码简化为绝对必需品后,我发现如果从AppEngine API方法返回Key对象,我将看到此错误。

@ApiMethod(name = "insertPureContainer", path="insertPureContainer", httpMethod = ApiMethod.HttpMethod.POST)
public Key insertPureContainer(PureContainer container, User user) throws OAuthRequestException {

    return ofy().save().entity(container).now();    

}

将导致此错误,返回更新的对象不会。