正常工作,從版本2.5.7 春 REST的數據不能正確執行PUT請求要更新的具有相關的資源資源。與按預期工作的PATCH請求不同!例如,Person
與Addres
有多對一的關聯。如果我們使用SDR v.2.5.6(Spring Boot v.1.4.3)執行PUT請求,那麼一切正常。但是,如果我們切換到2.5.7版本(即春季啓動v.1.4.4),那麼我們得到一個錯誤:春季數據REST - PUT請求沒有因爲v.2.5.7
Can not construct instance of Address: no String-argument constructor/factory method to deserialize from String value
同樣的情況,與其他類型的關聯,例如一個一對多(單向和雙向) - 請參閱我的代碼和測試example application。
這個問題出現在全部自1.4.4以來的Spring Boot版本,包括最新的穩定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, 有必要只是告訴龍目島使用@ConstructorProperties
註釋中 generated constructors壓制。 所以我在'lombok.config'文件中設置了lombok.anyConstructor.suppressConstructorProperties=true
,錯誤消失了。
不幸的是新問題被發現 - PUT請求根本不會更新關聯對象!
下面的例子演示了這一點。當我們試圖通過將他的地址從addresses/1
(初始值)更改爲addresses/2
來更新Person時 - 那麼它將保持不變:addresses/1
!除了之前的問題,這個版本還存在於彈性引導自1.4.4(SDR - 從v.2.5.7)開始的全部版本中。
我調試我的項目,發現上述問題的原因是隱藏在方法DomainObjectReader#mergeForPut
(見its source) - 它用新的從未替換相關的資源。
在我發佈Spring JIRA的這個問題之前,請在這裏舉報如果您的項目中存在此問題,您對此有何看法。
你可以得到我的測試here並在你的項目中檢查 - 測試是'獨立的',並不依賴於其他類/模塊(我只希望排除H2)。
@Entity
public class Person {
private String name;
@ManyToOne
private Address address;
// other stuff
}
@Entity
public class Address {
private String street;
// other stuff
}
嘗試更新的人:
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"
}
}
}
然後檢查人的 '新' 的地址 - 沒有更新地址:
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日
感謝Scott C. answer,事實證明,SDR具有錯誤,其在兩張票描述:DATAREST-1001和DATAREST-1012。
鏈接「http:// localhost:8080/api/persons/1/address」(v.2.5.6)的對象是什麼? – Andrew
@AndrewTobilko地址1:'{ 「街道」: 「地址1」, 「_links」:{ 「自我」:{ 的 「href」: 「HTTP://本地主機:8080/API /地址/ 1」 } , 「地址」:{ 的 「href」: 「HTTP://本地主機:8080/API /地址/ 1」 }} } ' – Cepr0
我不知道爲什麼它的第一個版本的作品。應該拋出同樣的異常,因爲'Address'實例不能從單個'String'構造。什麼是「BaseEntity」? – Andrew