我正在尝试维护数据库的本地存储,可通过REST API访问。我试图为REST客户端使用奇妙的RoboSpice和Spring库,Jackson解析/缓存JSON响应和ORMLite以持久保存结果对象。
问题是我不知道如何为我得到的JSON响应存储外部对象关系。有时JSON对象是嵌套的,有时它们被Id引用。
典型的系统响应
{
id:567,
name:"The only system",
competitions:[{
id:123,
system_id:567
...
}];
}
比赛回应
items: {
123:{
id:123,
system_id:567 // System only referenced by id
...
}}
另一场比赛的回应
items: {
123:{
id:123,
system_id:567, // System referenced by id and nested
system:{
id:567,
name:"The only system",
...
}
}
}
嵌套对象工作正常,但是在id中有引用的情况下会杀死它。我的数据模型有两个类如下。
系统类
@DatabaseTable("systems")
public class System {
@JsonProperty("id")
@DatabaseField(id=true, columnName="id")
private long id;
@JsonProperty("name")
@DatabaseField(columnName="name")
private String name;
@JsonProperty("competitions")
@ForeignCollectionField
private ForeignCollection<Competition> competitions;
// getters & setters omitted
}
比赛课
@DatabaseTable("competitions")
public class Competition {
@JsonProperty("id")
@DatabaseField(id=true,columnName="id")
private long id;
@JsonProperty("system_id")
@DatabaseField(columnName="id")
private long systemId; // This is definitely at least part of the problem
@JsonProperty("system")
@DatabaseField(foreign=true, columnName="system_id")
private System system;
// getters & setters omitted
}
有两个属性引用system_id似乎是一个明确的坏主意,但我无法找到我想要的行为的替代方案。即使系统对象没有嵌套在Competition对象中,竞争也应该能够将关系映射到本地数据库中的System对象,因为始终提供系统的id。
我怀疑的另一个问题是我使用了两个对象持久性,JacksonObjectPersister和InDatabaseObjectPersisterFactory(由RoboSpice提供,用于ORMLite)。原因是因为我不想将对象嵌套到数据库中的列表持久化。根据我的理解,Jackson应该缓存来自服务器的JSON响应,ORMLite应该缓存数据模型。
这是我得到的错误
02-03 15:15:57.640: D//DefaultRequestRunner.java:166(20944): 15:15:57.636 Thread-28
An exception occurred during service execution :org.codehaus.jackson.map.JsonMappingException:(was java.lang.NullPointerException)
(through reference chain: com.company.app.api.objects.List["items"]->
java.util.HashMap["51"]->
com.company.app.api.objects.Competition["system_id"])
对于一个似乎是一系列问题的道歉,我正在猛烈抨击墙壁。我将尝试用摘要包装这篇文章......
有没有办法将Jackson和ORMLite的对象关系拼凑起来用于我提供的JSON响应?