我正在尝试维护数据库的本地存储,可通过 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 似乎绝对是个坏主意,但我找不到我想要的行为的替代方案。即使系统对象没有嵌套在竞赛对象中,竞赛也应该能够将关系映射到本地数据库中的系统对象,因为始终提供系统的 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"])
为一个似乎有很多问题的问题道歉,我把头撞在墙上。我将尝试用一个总结来结束这篇文章......
对于我提供的 JSON 响应,有没有办法使用 Jackson 和 ORMLite 拼凑对象关系?