JsonMappingException:已经有id的POJO

时间:2013-03-15 00:46:43

标签: rest spring-mvc data-binding jackson json

尝试使用@JsonIdentityInfo jackson注释时出错。当我尝试反序列化对象时,我得到了以下异常:

  

无法读取JSON:已经有id(java.lang.Integer)的POJO [1](通过参考链:eu.cobiz.web.domain.Site [“operators”] - &gt; eu.yavix.web .domain.Account [“image”] - &gt; eu.cobiz.web.domain.Image [“@ Image”]);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException :< strong> 已经有id的POJO (java.lang.Integer)[1](通过参考链:eu.yavix.web.domain.Site [“operators”] - &gt; eu.cobiz.web.domain.Account [ “图像”] - &GT; eu.cobiz.web.domain.Image [ “@图像”])

我试图反序列化的JSON看起来像:

{
"@Site": 1,
"siteId": 1,
"name": "0",
"address": {
    "@Address": 2,
    "addressId": 4,
    "number": "22"
},
"operators": [
    {
        "accountId": 1,
        "email": "user982701361@yavix.eu",
        "image": {
            "@Image": 1,
            "imageId": 1,
            "uri": "http://icons.iconarchive.com/icons/deleket/purple-monsters/128/Alien-awake-icon.png"
        }
    },
    {
        "accountId": 2,
        "email": "user174967957@yavix.eu",
        "image": {
            "@Image": 2,
            "imageId": 2,
            "uri": "http://icons.iconarchive.com/icons/deleket/purple-monsters/128/Alien-awake-icon.png"
        }
    }
]
}

我的域对象用

注释
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@Image")

问题出现在@Id注释上,因为如果我删除注释问题就会消失(就像我对帐户所做的那样)但是根据我的理解,新功能对循环依赖有用,这对我在其他场景中很有用。两幅图像之间不应该存在冲突,因为它们是不同的对象。

有人知道如何解决或问题是什么?

2 个答案:

答案 0 :(得分:22)

注释id时应使用scope参数。然后,反序列化器将确保id在范围内是唯一的。

来自注释类型JsonIdentityInfo

  

范围用于定义对象标识的适用性:所有标识在其范围内必须是唯一的;其中scope被定义为该值和生成器类型的组合。

e.g。 @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property="@id", scope = Account.class)

答案 1 :(得分:6)

为避免ID冲突,请尝试使用ObjectIdGenerators.PropertyGenerator.classObjectIdGenerators.UUIDGenerator.class代替ObjectIdGenerators.IntSequenceGenerator.class