首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonMappingException:如何通过Restlet传递对象化实体(带键)

JsonMappingException:如何通过Restlet传递对象化实体(带键)
EN

Stack Overflow用户
提问于 2012-08-15 19:31:24
回答 3查看 1.5K关注 0票数 1

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

我选择Restlet作为rest框架。

当我尝试检索一个具有键属性的实体时,我遇到了一个问题。服务器抛出一个错误:

代码语言:javascript
复制
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"])

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

代码语言:javascript
复制
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 ...]
}

代码语言:javascript
复制
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 ...]

}

我能做些什么来解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-21 10:08:31

Objectify的键有一个方便的方法getRoot(),它返回祖先链中的根元素。当一个键是根时,getRoot()返回这个。Jackson检测到这是一个循环,因此你得到了错误。

解决这个问题的最好方法是不要试图将键序列化为json对象。在JSON中,键更好地表示为字符串化版本。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-08-16 23:46:34

您是否包括

代码语言:javascript
复制
<inherits name="com.googlecode.objectify.Objectify" />

在你的GWT模块中?

票数 0
EN

Stack Overflow用户

发布于 2018-01-13 20:41:00

我遇到了类似的问题,导致了这个确切的错误。在将代码减少到绝对要点之后,我发现如果我从AppEngine应用程序接口方法返回一个键对象,我会看到这个错误。

代码语言:javascript
复制
@ApiMethod(name = "insertPureContainer", path="insertPureContainer", httpMethod = ApiMethod.HttpMethod.POST)
public Key insertPureContainer(PureContainer container, User user) throws OAuthRequestException {

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

}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11968513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档