1

我正在尝试维护数据库的本地存储,可通过 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 拼凑对象关系?

4

0 回答 0