2015-01-27 11 views
7

Da quello che posso dire, vengono forniti i mezzi per convertire un oggetto complesso nel formato HAL corretto. Questo è ovviamente sfruttato nel marshalling degli oggetti nel framework stesso. Resource e Link oggetti, eccClient Java per il POST di entità complesse a un servizio REST/HATEOAS di Spring Data

Per il bene di un caso d'uso: Company 1 è uno esistente Company nel mio sistema. Voglio aggiungere un nuovo Employee che funziona per Company 1

Di seguito è un esempio Employee oggetto che riceverai da un servizio basato su Spring Data REST. Spring HATEOAS fornisce anche i mezzi per costruire da soli questi oggetti.

{ 
    "id": null, 
    "firstName": "bZWthNFk", 
    "lastName": "GtTnrqka", 
    "loginId": "zTk5rT", 
    "active": true, 
    "_links": { 
     "company": { 
      "href": "http://localhost/companies/1"; 
     } 
    } 
} 

Tuttavia, questo sembra non lavoro per la pubblicazione l'oggetto. Se ho capito bene, che lo stesso oggetto avrebbe dovuto essere pubblicato come:

{ 
    "id": null, 
    "firstName": "bZWthNFk", 
    "lastName": "GtTnrqka", 
    "loginId": "zTk5rT", 
    "active": true, 
    "company": "http://localhost/companies/1" 
} 

Per quanto posso dire, non ci sono mezzi forniti sia dal progetto di hateoas o dati REST per produrre questo oggetto per la pubblicazione a un servizio HAL valido, tramite RestTemplate o altri mezzi. In effetti, non riesco a trovare alcun mezzo per inviare prontamente un oggetto complesso senza alcun controllo manuale. Mi sbaglio nell'assumerlo?

Come si può costruire un SDK Java valido per la comunicazione service-to-service che sfrutta i principi di HATEOAS senza questo strumento per gli oggetti POST in modo affidabile?


Per farla breve, desidero pubblicare questo oggetto senza dover serializzare gli URI per le associazioni.

public class Employee { 
    private Integer id; 
    @NotNull 
    private Company company; 
    private String firstName; 
    private String lastName; 
} 

ho creato la seguente richiesta di miglioramento in riferimento a questo:

https://jira.spring.io/browse/SPR-12678

risposta

2

L'approccio hai suggerito dovrebbe effettivamente lavorare, a patto di utilizzare almeno la versione 2.0 di Spring Data REST.

Si dovrebbe anche avere una risorsa di associazione come http://app.com/employee/10/company. È possibile PUT un nuovo collegamento a quella posizione utilizzando il tipo di supporto text/uri-list o rimuovere la società da Employee con un DELETE.

UDATE

Sembra non mi rivolgo la vostra preoccupazione principale, che è stato chiarito dal vostro aggiornamento e commenti. Quindi prendiamo la tua classe Employee che ha un'associazione con uno Customer.

Come si può vedere dalla risposta JSON che hai postato, la struttura dati con cui funziona l'API REST non contiene un oggetto Customer (o Company in questo caso), solo un collegamento. Un client di solito lavora con la struttura dati definita dall'API. Quindi customer sarebbe il collegamento in primo luogo e non sarebbe necessario serializzare un oggetto su un collegamento.

Se il client utilizza internamente una diversa struttura dati, è comunque necessario un qualche tipo di conversione. Ma la ragione sarebbe la diversa struttura, non i collegamenti HAL o di associazione.

+0

Ciò ha senso :-) Il mio seguito è quello di chiedere come gestireste questa situazione dato un vincolo NotNull sulla società? – bvulaj

+0

@BrandonV It [sembra] (http://stackoverflow.com/questions/22097646/spring-data-rest-2-0-0-release-breaks-code-working-previously-with-rc1#comment33577957_22111435) che tu in realtà dovrebbe essere in grado di pubblicare un oggetto come suggerito, purché si abbia almeno la versione 2.0 di Spring Data REST. – zeroflagL

+0

Sì, so che molto funziona, in realtà, anche se il tuo suggerimento sulla risorsa dell'associazione era anche interessante. La mia preoccupazione è legata agli strumenti che Spring HATEOAS fornisce per interagire con i servizi basati su HAL in questo modo. Facendo questo a mano, o scrivendo il mio personale di marshall per gestire un caso comune, sembra un po 'non intuitivo. – bvulaj