ので、正常に動作しません。期待どおりに動作するPATCHリクエストとは異なります!スプリングデータREST - PUT要求が<strong>2.5.7</strong>スプリングデータRESTが適切リソース</strong>が関連付けられている<strong>リソースを更新する<strong>PUT</strong>要求を行わないバージョンのでv.2.5.7
たとえば、Person
は、Addres
と多対1の関連性を持ちます。 SDR v.2.5.6(Spring Boot v.1.4.3)でPUTリクエストを実行すると、すべて正常に動作します。我々は、バージョン2.5.7(すなわち春ブートv.1.4.4へ)に切り替えた場合でも、我々は、エラーを取得:
Can not construct instance of Address: no String-argument constructor/factory method to deserialize from String value
同じことが一対多で例えば、団体の他のタイプで発生します(単方向および双方向) - 私のexample applicationのコードとテストを参照してください。
すべてバージョン1.4.4以降、最新の安定版1.5.6および最新の2.0.0-SNAPSHOTバージョンが含まれています。
この状況を回避するために、SDR v.2.5.6(Spring Boot v.1.4.3)に切り替えることができます。
私は、あなたが問題と遊ぶ支援するために要求のポストマンコレクションを用意しました:SDR PUT Issue
UPDATE 2017年8月14日
私はエラーCan not construct instance of Address: no String-argument constructor/factory method to deserialize from String value
を回避する方法を発見しました。
私はこのプロジェクトでLombokを使用しているので、それだけで generated constructorsで@ConstructorProperties
注釈を使用して抑制するためにロンボクを伝えることが必要である 。 したがって、 'lombok.config'ファイルにlombok.anyConstructor.suppressConstructorProperties=true
を設定しましたが、エラーはなくなりました。
残念ながら新しい問題が見つかりました - PUTリクエストは、関連するオブジェクトをすべて更新しません。!
以下の例は、これを実証しています。アドレスをaddresses/1
(初期値)からaddresses/2
に変更してPersonを更新しようとすると、それは同じままです:addresses/1
!以前の問題と同様に、これは、にあります。すべてのバージョンは、1.4.4(SDR - v.2.5.7から)以降のSpring Bootのバージョンです。
私は(its sourceを参照してください)私のプロジェクトをデバッグし、問題の原因は方法DomainObjectReader#mergeForPut
に隠されていることが判明 - それは、決して新しいものに関連付けられたリソースを置き換えます。
この問題をSpring JIRAに投稿する前に、を報告してください。あなたのプロジェクトにこの問題がある場合は、についてどう思われますか?
あなたのプロジェクトで私のテストhereをチェックすることができます。テストは「スタンドアロン」で、他のクラス/モジュールに依存しません(H2のみを除きます)。
PUT http://localhost:8080/api/persons/1
{
"name": "person1u",
"address": "http://localhost:8080/api/addresses/2"
}
正しい応答行き方::その後、人の '新たな' アドレスをチェックし
{
"name": "person1u",
"_links": {
"self": {
"href": "http://localhost:8080/api/persons/1"
},
"person": {
"href": "http://localhost:8080/api/persons/1"
},
"address": {
"href": "http://localhost:8080/api/persons/1/address"
}
}
}
- アドレスは更新されませんでしたが
@Entity
public class Person {
private String name;
@ManyToOne
private Address address;
// other stuff
}
@Entity
public class Address {
private String street;
// other stuff
}
は人を更新しようとすると: GET http://localhost:8080/api/persons/1/address
{
"street": "address1",
"_links": {
"self": {
"href": "http://localhost:8080/api/addresses/1"
},
"address": {
"href": "http://localhost:8080/api/addresses/1"
}
}
}
UPDATE 2017年8月24日
スコットC. answerのおかげで、それはSDRの2枚のチケットに記述されているバグ、持っていることが判明:DATAREST-1001とDATAREST-1012を。
リンクは、http:// localhost:8080/api/persons/1/address'(v.2.5.6)の対象は何ですか? – Andrew
@AndrewTobilkoアドレス1: '{ "ストリート": "アドレス1"、 "_links":{ "自己":{ "HREF": "のhttp:// localhostを:8080/API /アドレス/ 1" } 、 " " href ":" http:// localhost:8080/api/addresses/1 " } } } – Cepr0
なぜ最初のバージョンで動作するのか分かりませんでした。 'Address'インスタンスが単一の' String'から構築できないため、同じ例外がスローされているはずです。 'BaseEntity'とは何ですか? – Andrew