У меня есть три сущности: Родитель, его дочерняя и некоторые ссылки:Spring Data Rest - не может обновить (PATCH) список дочерних объектов, которые имеют ссылки на другое лицо
Родитель
@Entity
@Table(name = "parents")
public class Parent extends LongId {
@NonNull
@Column(nullable = false)
private String name = "Undefine";
@NonNull
@OneToMany(cascade = MERGE)
private List<Child> children = new ArrayList<>();
}
Детский
@Entity
@Table(name = "children")
public class Child extends LongId {
@NonNull
@Column(nullable = false)
private String name;
@NonNull
@ManyToOne(optional = false)
private Reference reference;
}
Ссылка
@Entity
@Table(name = "references")
public class Reference extends LongId {
@NotEmpty
@Column(nullable = false)
@Length(min = 3)
@NonNull
private String description;
}
И их репозитории:
@RepositoryRestResource
public interface ParentRepo extends JpaRepository<Parent, Long> {
}
@RepositoryRestResource
public interface ChildRepo extends JpaRepository<Child, Long> {
}
@RepositoryRestResource
public interface ReferenceRepo extends JpaRepository<Reference, Long> {
}
Заблаговременно я сохранялся несколько детей со ссылками. Затем я создал нового родителя с одним ребенком:
POST http://localhost:8080/api/parents
{
"name" : "parent2",
"children" : [
"http://localhost:8080/api/children/3"
]
}
И успешно получил статус 201 Создано. Но когда я пытаюсь добавить еще одного ребенка в parent2 (обновить его с патчем):
PATCH http://localhost:8080/api/parents/2
{
"name" : "parent2",
"children" : [
"http://localhost:8080/api/children/3",
"http://localhost:8080/api/children/4"
]
}
Я получил сообщение об ошибке:
{
"cause": {
"cause": null,
"message": "Can not construct instance of restsdemo.domain.entity.Child: no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/children/4')\n at [Source: N/A; line: -1, column: -1]"
},
"message": "Could not read payload!; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of restsdemo.domain.entity.Child: no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/children/4')\n at [Source: N/A; line: -1, column: -1]"
}
Если удалить ссылку Ссылку объект от ребенка :
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "children")
public class Child extends LongId {
@NonNull
@Column(nullable = false)
private String name;
// @NonNull
// @ManyToOne(optional = false)
// private Reference reference;
}
все работает отлично - child4 успешно добавляет parent2.
Не могли бы вы указать мне, как правильно обновлять список дочерних объектов, если они имеют ссылку на другие объекты?
Репо с этим примером здесь: https://github.com/Cepr0/restdemo
попробовать после добавления другого конструктора в классе 'Parent' с этой подписью' общественного Parent (именем String, List детей) ' –
Спасибо @abhishek! Но это не помогло ( – Cepr0
@AbhishekBhatia, у меня уже есть конструктор 'public Parent (String name, Child ... children)' и добавление вашего не помогло. (У меня есть конструкторы в каждом классе - я использую Lombock) – Cepr0