У меня есть две сущности, связанные с @ManyToOne:
@Entity
public class Header {
@Id
@GeneratedValue
private Long id;
private String name;
}
и
@Entity
public class Detail {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "headerId")
private Header header;
}
Я использую запрос PATCH с Content-Type: application / json-patch + jsonсвязать Подробности с Заголовком после создания, но не получается следующим образом (ответ об ошибке отформатирован для ясности):
curl -X PATCH http://localhost:8080/details/3 -H 'Content-Type: application/json-patch+json' -d '[{"op":"replace","path":"/header","value":"http://localhost:8080/headers/2"}]'
{
"cause": {
"cause": {
"cause": {
"cause": {
"cause" : null,
"message" : "No converter found capable of converting from type [java.lang.String] to type [@javax.persistence.ManyToOne @javax.persistence.JoinColumn com.test.sdr.jsonpatchtest.Header]"
},
"message" : "EL1001E: Type conversion problem, cannot convert from java.lang.String to @javax.persistence.ManyToOne @javax.persistence.JoinColumn com.test.sdr.jsonpatchtest.Header"
},
"message" : "Type conversion failure"
},
"message" : "EL1034E: A problem occurred whilst attempting to set the property 'header': Type conversion failure"
},
"message" : "Could not read an object of type class com.test.sdr.jsonpatchtest.Detail from the request!; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1034E: A problem occurred whilst attempting to set the property 'header': Type conversion failure"
}
Обновление ассоциации с помощью запроса PATCH не-json-patch работает нормально:
curl -X PATCH http://localhost:8080/details/3 -H 'Content-Type: application/json' -d '{"header":"http://localhost:8080/headers/2"}'
Обновление ассоциации через запрос PUT также работает:
curl -X PUT http://localhost:8080/details/3/header -H 'Content-Type: text/uri-list' -d 'http://localhost:8080/headers/1'
Отладка кода (сравнение запросов PATCH, не относящихся к json-patch и json-patch), показывает следующее:
- Не-json-patch использует UriToEntityConverter, который извлекает идентификатор из URI и ищет сущность заголовка по идентификатору.
- json-patch использует GenericConversionService $ NoOpConverter, так как онне удается найти преобразователь из строки в заголовок
Мой запрос на json-patch неверен?
Нужно ли явно регистрировать преобразователь, чтобы обновления связей работали через json-patch PAT?CH просит?
Это неподдерживаемая функция?или ошибка?
Я отправил пример приложения на GitHub , который демонстрирует эту проблему.
Спасибо за ваши ответы.