2014-11-21 7 views
13

Итак, допустим, у меня есть существующее приложение с двумя конечными точками/людьми и/брюками. Вызов GET/человек возвращается:Необязательно отключить формат HATEOAS в Spring Data Rest

[ 
    { 
     "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 Data Rest и вызовите 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 сильно склоняется к Hypermedia ... но я не покупаю это, предоставляя возможность «отключить» гипермедиа на основе заголовка, тем самым предоставляя больше вариантов, это плохо.

В стороне, я немного не уверен, как на самом деле добиться этого через мои собственные контроллеры. Если я создаю Контроллер и попытаюсь переопределить команду RequestMapping с помощью `execute = 'application/json, то я могу получить« raw »json с помощью Accept =« application/json », но если я передам Accept =" application/hal + json «Я получаю 406 с« Не могу найти приемлемого представления ». Похоже, что сопоставления ресурсов SDR не сопоставляются с типом контента ... любые предложения?

+0

Да, вы сделали бы это с другим заголовком Accept. –

+0

Джонатан, вопрос на самом деле не связан с тем, как узнать *, когда *, чтобы вернуть ответ non-hateoas, но вместо этого я хотел бы включить Spring Data Rest, чтобы не генерировать элементы Hypermedia в ответе. – Ben

+1

Я считаю, что Spring Data REST использует для этого два разных HttpMessageConverters и что они находятся в цепочке. Если заголовок Accept указывает приложение/hal + json, TypeConstrainedMappingJackson2HttpMessageConverter будет обрабатывать его и производить HAL. Если, однако, заголовок является только «application/json», обычный MappingJackson2HttpMessageConverter запускается и не будет сериализоваться в HAL. Не уверен, что это помогает, но я бы посмотрел на попытку настроить этот последний конвертер, чтобы не возвращать ссылки гипермедиа. –

ответ

13

Короткий ответ: вы не можете использовать отдых с пружинными данными без ненависти. Если вы хотите создать свой веб-сервис без ненависти, вам придется писать свои собственные контроллеры (которые все еще могут использовать репозитории весенних данных).

Цитирование Оливер Гирке в this SO post:

На самом деле вся моя точка: сервер просто делает приличный REST. Если , который разбивает клиент, это клиент, который должен быть исправлен. (исправлено). Таким образом, гипермедийный аспект является фундаментальным для Spring Data REST, и мы не собираемся отказываться от этого. Вероятно, это не , удовлетворяющий вашей конкретной ситуации, но должен ответить на вопрос как минимум :). - Oliver Gierke

+9

Я удивлен, что вы не можете переопределить конвертер serializer/message, чтобы просто не выводить ссылки ... кажется, что это должно быть возможно –