2014-11-21 18 views
13

Quindi diciamo che ho un'applicazione esistente con due endpoint/persone e/pants. Chiamare GET/persone ritorna:Facoltativamente disabilitare il formato HATEOAS in 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" 
      } 
     ] 
    } 
] 

Se dovessi usare primavera dati Riposo e chiamare GET/persona mi piacerebbe ricevere qualcosa come:

{ 
    "_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" 
        } 
       } 
      } 
     ] 
    } 
} 

Diciamo che ho un sacco di clienti esistenti che Non voglio dover cambiare: esiste un modo per disabilitare le parti ipermediali della risposta in alcuni casi (ad esempio Accept = "application/json") ma abilitarli per gli altri (Accept = "hal + json") ?

Grazie!

Aggiornato

Va bene - così sembra che molto al mio dispiacere, quello che sto cercando di fare non è supportata. Sottolineo perché gli SDR si stiano fortemente orientando verso Hypermedia ... ma non comprerei che fornire la capacità di "disabilitare" l'ipermedia basata su un'intestazione, fornendo così più opzioni è una cosa negativa.

A parte questo, sono un po 'incerto su come realizzarlo tramite i miei controller. Se creo un controller e tento di sovrascrivere il RequestMapping /people con `produce =" application/json "sono in grado di recuperare il json" raw "con Accept =" application/json "ma se passo Accept =" application/hal + json "Ricevo un 406 con" Impossibile trovare una rappresentazione accettabile ". Sembra che i mapping delle risorse SDR non siano mappati con un tipo di contenuto ... qualche suggerimento?

+0

Sì, lo si farebbe con un'intestazione Accept diversa. –

+0

Jonathan, la domanda non è proprio come sapere * quando * restituire la risposta non-hateoas, ma come abilitare Spring Data Rest a non generare gli elementi Hypermedia nella risposta. – Ben

+1

Credo che Spring Data REST utilizzi due HttpMessageConverters diversi per questo, e che siano in una catena. Se l'intestazione Accept indica application/hal + json, TypeConstrainedMappingJackson2HttpMessageConverter lo gestirà e produrrà HAL. Se, tuttavia, l'intestazione è solo 'application/json', il normale MappingJackson2HttpMessageConverter entra in gioco e non serializza su HAL. Non sono sicuro che questo aiuti, ma vorrei provare a modificare questo ultimo convertitore per non restituire i collegamenti ipermediali. –

risposta

13

La risposta breve è che non è possibile utilizzare il periodo di riposo dei dati di primavera senza gli hateoas. Se vuoi creare il tuo servizio web senza hateoas, dovrai scrivere i tuoi controllori (che possono ancora utilizzare repository di dati primaverili).

Citando Oliver Gierke in this SO post:

In realtà tutto il mio punto è: il server è solo facendo REST decente. Se interrompe il client, è necessario correggere il client (ottimizzato). Quindi l'aspetto ipermediale è fondamentale per Spring Data REST e non intendiamo tirarci indietro. Probabilmente non è soddisfacente nella tua situazione concreta, ma dovrebbe rispondere alla domanda almeno :). - Oliver Gierke

+9

mi sorprende che non sia possibile sovrascrivere il serializzatore/convertitore di messaggi per non emettere i collegamenti ... sembra che dovrebbe essere possibile –

Problemi correlati