Весна неразрешенная прямая ссылка во многих на одного - PullRequest
1 голос
/ 24 марта 2020

У меня есть задача и пользовательский объект с отношением один ко многим. Таким образом, в engli sh пользователь может иметь несколько задач, и задача принадлежит одному пользователю

public class User {
    @Id
    private Long id;

    @OneToMany(mappedBy="task")
    private Set<Task> tasks;
}
public class Task {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    @JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
    @JsonIdentityReference(alwaysAsId=true)
    @JsonProperty("user_id")
    private User user;
    private String name;
}

Когда я пытаюсь POST задачу с

{
  "name": "Test task",
  "user_id": 1
}

я получаю следующее:

Unresolved forward references for: ; nested exception is com.fasterxml.jackson.databind.deser.UnresolvedForwardReference

РЕДАКТИРОВАТЬ: После этот пост и реализации EntityIdResolver возвращает в этой ошибке:

 Unable to locate persister: java.lang.Object; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unable to locate persister

1 Ответ

0 голосов
/ 24 марта 2020

Вам нужно создать и связать объект, реализующий ObjectIdResolver с автосвязью EntityManager. Джексон не знает, как найти правильную сущность , поскольку в этом случае нет никакой связи между реализацией ORM и библиотекой де / сериализации.

Сам этот преобразователь:

Определение API, используемого для разрешения фактического Java объекта из идентификаторов объектов (как аннотировано с помощью JsonIdentityInfo).

Ключевой метод - ObjectIdResolver::resolveId, где вы получить элемент для сопоставления по его идентификатору, используя следующий метод:

Пример кода:

@Override
public Object resolveId(final ObjectIdGenerator.IdKey id) {
    return entityManager.find(id.scope, id.key);
}

После этого необходимо использовать распознаватель с @JsonIdentityInfo:

@JsonIdentityInfo(
    generator= ObjectIdGenerators.PropertyGenerator.class, 
    property="id", 
    resolver = CustomIdResolver.class)
...
private User user;

Этот вопрос также может помочь: JsonIdentityInfo Resolver, созданный в Spring Context

...