Spring Data Rest - PUT в хранилище молча завершается неудачей для дочерних ссылок - PullRequest
0 голосов
/ 30 января 2019

Я использую Spring Data Rest с Spring Boot 2.1.1.RELEASE.

У меня есть класс User с отношением @ManyToMany к классу Skill.

  • Когда я создаю POST для создания пользователя с его навыками, все работает нормально.
  • Когда я делаю PUT для обновления пользователя, навыки не обновляются, ошибка не выдается.
  • Но когда я делаю PATCH вместо PUT, навыки корректно обновляются.

Кто-нибудь сталкивался с подобной проблемой?Я нашел другой (старый) вопрос по этому поводу, но решения не существует ( Spring Data Rest - PUT не работает для связанных ссылочных типов? )

Возможно, я что-то пропустил,где-то ...

(код с использованием Lombok)

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {

@Id
@GeneratedValue
private Long id;

private String firstName;
private String lastName;

@ManyToMany
@JoinTable(name="user_skills")
private List<Skill> skills = new ArrayList<>();

}

@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Skill {

@Id
@GeneratedValue
private Long id;

private String name;
}

Я делаю PUT со следующим JSON содержимым:

{
  "id": 7,
  "firstName": "John",
  "lastName": "Doe",
  "skills": ["http://localhost:9001/skills/1", "http://localhost:9001/skills/2", "http://localhost:9001/skills/3"]
}

firstName илиlastName может быть изменено, но навыки остаются неизменными.

Если я выполняю PATCH с той же полезной нагрузкой, навыки корректно изменяются.

Это должно работать с PUT,не так ли?

1 Ответ

0 голосов
/ 30 января 2019

После дополнительных исследований кажется, что это поведение по назначению: PUT не обновляет ссылки на ресурсы, только основные атрибуты.

Ответ от Оливера Гирке здесь: https://jira.spring.io/browse/DATAREST-1001?focusedCommentId=135791&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-135791:

Я посмотрел на это, и я бы сказал, что вы ожидаете, что вещи будут работать так, как они не работают.Запросы PUT не учитывают связи со связанными ресурсами, то есть связанными ресурсами, на которые указывают ссылки.Причина этого двоякая:

  1. Если мы рассмотрим URI для полей ассоциации в полезной нагрузке для обновления этих ассоциаций, возникает вопрос о том, что должно происходить, если не указан URI.При текущем поведении связанные ассоциации просто не являются частью полезной нагрузки, поскольку они находятся только в блоке _links.У нас есть два варианта в этом сценарии: стирание не переданных ассоциаций, что нарушает подход «ПОЛУЧИТЕ, ЧТО ВЫ ПОЛУЧАЕТЕ».Только стирание тех, которые поставляются с использованием null, может как-то размыть «вы УДАЛИТЕ все состояние ресурса».
  2. По всем причинам, указанным в 1. Есть выделенные выделенные ресурсы ассоциации, которыми можно манипулировать напрямую..

Похоже, что если вы хотите изменить оба состояния ресурса и ассоциации одновременно, я полагаю, что выделенный ресурс для этого - путь.

Другие публикации и ссылки:

...