从Android的REST服务中保持实体关系

时间:2014-02-03 02:54:38

标签: android spring jackson ormlite robospice

我正在尝试维护数据库的本地存储,可通过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响应?

0 个答案:

没有答案