JsonMappingException: уже был POJO для идентификатора

У меня ошибка при попытке работать с аннотацией Джексона @JsonIdentityInfo. Когда я пытаюсь десериализовать объект, я получаю следующее исключение:

Не удалось прочитать JSON: уже был POJO для идентификатора (java.lang.Integer) [1] (через цепочку ссылок: eu.cobiz.web.domain.Site["operator"]->eu.yavix.web.domain.Account["image"]->eu.cobiz.web.domain.Image["@Image"]); вложенным исключением является com.fasterxml.jackson.databind.JsonMappingException: уже было POJO для идентификатора (java.lang.Integer) [ 1] (через цепочку ссылок: eu.yavix.web.domain.Site["operator"]->eu.cobiz.web.domain.Account["image"]->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 ответа

Решение

Вы должны использовать scope параметр при аннотировании идентификаторов. Затем десериализатор должен убедиться, что идентификатор является уникальным в области видимости.

Из типа аннотации JsonIdentityInfo:

Область действия используется для определения применимости идентификатора объекта: все идентификаторы должны быть уникальными в пределах своей области видимости; где область действия определяется как комбинация этого значения и типа генератора.

например @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property="@id", scope = Account.class)

Чтобы избежать конфликта идентификаторов, попробуйте использовать ObjectIdGenerators.PropertyGenerator.class или же ObjectIdGenerators.UUIDGenerator.class вместо ObjectIdGenerators.IntSequenceGenerator.class

Другие вопросы по тегам