Spring Data REST: невозможно обновить ассоциацию с помощью json-patch - PullRequest
0 голосов
/ 14 марта 2019

У меня есть две сущности, связанные с @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 , который демонстрирует эту проблему.

Спасибо за ваши ответы.

...