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, поскольку, если я удаляю аннотацию, проблема исчезает (как я сделал для учетной записи), но, по моему мнению, новая функция полезна для циклических зависимостей, которые полезны для меня в других сценариях. Не должно быть конфликта между двумя изображениями, поскольку они являются разными объектами.
Есть ли у кого-нибудь идея о том, как решить или в чем проблема?
Ответы
Ответ 1
Вы должны использовать свойство scope при аннотации идентификаторов. Затем де-сериализатор удостоверится, что идентификатор уникален в пределах области действия.
из типа аннотации JsonIdentityInfo:
Область определения используется для определения применимости Идентификатора объекта: все идентификаторы должны быть уникальными в пределах своей области; где область определяется как комбинация этого значения и типа генератора.
например.
@JsonIdentityInfo (generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id", scope = Account.class)
Ответ 2
Чтобы избежать конфликта id, попробуйте использовать ObjectIdGenerators.PropertyGenerator.class
или ObjectIdGenerators.UUIDGenerator.class
вместо ObjectIdGenerators.IntSequenceGenerator.class