Подтвердить что ты не робот

JsonMappingException: уже было POJO для id

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

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

JSON Я пытаюсь десериализовать выглядит так:

{
"@Site": 1,
"siteId": 1,
"name": "0",
"address": {
    "@Address": 2,
    "addressId": 4,
    "number": "22"
},
"operators": [
    {
        "accountId": 1,
        "email": "[email protected]",
        "image": {
            "@Image": 1,
            "imageId": 1,
            "uri": "http://icons.iconarchive.com/icons/deleket/purple-monsters/128/Alien-awake-icon.png"
        }
    },
    {
        "accountId": 2,
        "email": "[email protected]",
        "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, поскольку, если я удаляю аннотацию, проблема исчезает (как я сделал для учетной записи), но, по моему мнению, новая функция полезна для циклических зависимостей, которые полезны для меня в других сценариях. Не должно быть конфликта между двумя изображениями, поскольку они являются разными объектами.

Есть ли у кого-нибудь идея о том, как решить или в чем проблема?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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