2014-11-21 33 views
13

假設我有一個現有的具有兩個端點/人員和/褲子的應用程序。調用get /人返回:可選擇在Spring Data Rest中禁用HATEOAS格式

[ 
    { 
     "name":"john", 
     "age":37, 
     "pants":[ 
      { 
       "color":"green", 
       "brand":"levis", 
       "size":"medium" 
      }, 
      { 
       "color":"indigo", 
       "brand":"jncos", 
       "size":"medium-with-huge-legs" 
      } 
     ] 
    }, 
    { 
     "name":"june", 
     "age":23, 
     "pants":[ 
      { 
       "color":"pink", 
       "brand":"gap", 
       "size":"small" 
      } 
     ] 
    } 
] 

如果我是使用Spring數據休息和調用get /人我會收到這樣的:

{ 
    "_links":{ 
     "next":{ 
      "href":"http://myapp.com/people?page=1&size=20" 
     }, 
     "self":{ 
      "href":"http://myapp.com/people{&page,size,sort}", 
      "templated":true 
     }, 
     "search":{ 
      "href":"http://myapp.com/people/search" 
     } 
    }, 
    "_embedded":{ 
     "people":[ 
      { 
       "name":"john", 
       "age":37, 
       "_links":{ 
        "self":{ 
         "href":"http://myapp.com/people/john" 
        }, 
        "pants":{ 
         "href":"http://myapp.com/people/john/pants" 
        } 
       } 
      }, 
      { 
       "name":"june", 
       "age":23, 
       "_links":{ 
        "self":{ 
         "href":"http://myapp.com/people/june" 
        }, 
        "pants":{ 
         "href":"http://myapp.com/people/june/pants" 
        } 
       } 
      } 
     ] 
    } 
} 

比方說,我有一大堆的現有客戶的那我不想改變 - 在某些情況下是否有辦法禁用響應的超媒體部分(比如說Accept =「application/json」),但爲其他人啓用它(Accept =「hal + json」) ?

謝謝!

更新

好了 - 這樣看來,令我懊惱的是,不支持什麼,我希望做。我沒有說明SDR爲什麼非常傾向於超媒體......但是我不會購買那種提供基於頭部「禁用」超媒體的能力,因此提供更多選擇是一件壞事。

除此之外,我有點不確定如何通過我自己的控制器實現。如果我創建一個控制器並試圖用`produce =「application/json覆蓋/people的RequestMapping,我可以通過Accept =」application/json「獲得」raw「json,但是如果我通過Accept =」application/hal + json「我用」找不到可以接受的表示法「得到406。它看起來像SDR資源映射沒有與內容類型映射......任何建議?

+0

是的,你可以用不同的Accept頭做。 – 2014-11-22 20:53:47

+0

Jonathan,問題並不在於如何知道*何時返回非討厭的響應,而是如何讓Spring Data Rest在響應中不生成超媒體元素。 – Ben 2014-11-23 21:48:02

+1

我認爲Spring Data REST爲此使用了兩個不同的HttpMessageConverters,並且它們處於鏈中。如果Accept頭指示application/hal + json,則TypeConstrainedMappingJackson2HttpMessageConverter將處理它併產生HAL。但是,如果標題只是'application/json',常規的MappingJackson2HttpMessageConverter會啓動並且不會序列化爲HAL。不知道這是否有幫助,但我會考慮試圖調整後者轉換器不返回超媒體鏈接。 – 2014-11-24 17:30:05

回答

13

簡短的回答是,你不能使用沒有討厭的spring-data-rest。如果你想建立你的web服務而不用討厭,你必須編寫你自己的控制器(它仍然可以使用spring-data存儲庫)。

this SO post引用奧利弗·基爾克:

其實我的整個觀點是:服務器只是做體面的REST。如果打破客戶端的 ,則客戶端需要修復 (調整)。所以超媒體方面是Spring REST的基礎之一,我們不打算退出。這可能不是 滿足您的具體情況,但至少應回答問題 :)。 - Oliver Gierke

+9

我很驚訝,你不能重寫序列化/消息轉換器只是不輸出鏈接...似乎應該是可能的 – 2014-11-25 18:40:21

相關問題