2012-01-16 15 views
5

Abbiamo un'applicazione web server Java in cui il nucleo del sistema contiene un modello di dominio molto complesso che è stato progettato in base ai principi del design guidato dal dominio. Per la maggior parte, questi oggetti di dominio sono stati influenzati molto poco dalle altre preoccupazioni delle applicazioni.Il modo migliore per implementare le relazioni di collegamento per HATEOAS in XML?

Ora stiamo cercando di mettere un'API di servizi Web REST di fronte al sistema e sono alle prese con il modo migliore per implementare i collegamenti HATEOAS che rientrano nel nostro nuovo tipo di supporto. Ad esempio, supponiamo di avere classe di dominio foo che ha un ID e nome proprietà con le annotazioni JAX-B:

@XmlType(name = "foo") 
public class FooImpl implements Foo { 

    private String name; 
    private String id; 

    ...snip.... 

@XmlID 
@XmlAttribute 
@Override 
public String getId() { 
    return id; 
} 

    @XmlElement 
    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(final String name) { 
     this.name = name; 
    } 
} 

Ma l'XML voglio tornare assomiglia a questo:

<foo id="123" href="http://myserver.com/foos/123"> 
    <name>myFoo</name> 
    <links> 
      <link rel="previous" href="http://myserver.com/foos/122" type="application/mything+xml" /> 
      <link rel="next" href="http://myserver.com/foos/124" type="application/mything+xml" /> 
      <link rel="edit" href="http://myserver.com/foos/123" type="application/mything+xml" /> 
      <link rel="revise" href="http://myserver.com/foos/123" method="put" type="application/mything+xml" /> 
      <link rel="cancel" href="http://myserver.com/foos/123?op="cancel"" method="post" type="application/mything+xml" /> 
    </links> 
</foo> 

Che cosa è il modo migliore per farlo in modo tale da non inquinare il design del mio dominio con questi collegamenti di tipo multimediale, ma posso ancora usare la potenza di JAX-B per il marshalling XML? Ecco alcuni pensieri:

1) Adattatori JAX-B - potrei usarli per modificare l'XML per le entità e inserire i collegamenti ... è possibile? è ragionevole? Qualche esempio?

2) DTO Layer - Creare un nuovo livello di servizio REST che converta gli oggetti dominio in DTO. Finora siamo stati in grado di evitare il fastidio di DTO. Mentre ciò fornirebbe una flessibilità totale in ciò che restituiamo al cliente, anche io non sto cercando di creare client agnostici di dominio qui.

3) Link Intestazioni - Mi piace molto questa idea, ma non credo che funzionerebbe (di per sé) perché a volte le nostre risorse contengono raccolte di risorse secondarie. In questo caso, le sottorisorse devono ancora essere sottoposte a marshalling in XML che contiene collegamenti/hrefs, ecc. Quindi, mentre le intestazioni dei collegamenti risolvono il problema con il tipo di livello superiore, non risolvono l'intero problema. Sentiti libero di dire il contrario!

C'è un altro approccio che mi aiuterà a evitare DTO e tuttavia a rimanere trasparente al modello di dominio?

+0

L'aggiunta di collegamenti al modello richiede l'estensione delle classi di dominio, ma il livello DAO non può creare un'istanza di tali oggetti. Considerare l'aggregazione e l'aggiunta di JAXB (o qualunque altra mappatura XML) a quel livello. –

+0

Se ho capito, creare un modello REST che aggrega gli oggetti del dominio con i collegamenti e invialo. Un po 'come un DTO, ma più come estendere il dominio per includere i collegamenti. Capisco? – HDave

+2

Sì, vorrei creare wrapper. Se necessario, delegare le chiamate agli oggetti DAO. Quindi in pratica si tratta di [pattern di progettazione decoratore] (http://en.wikipedia.org/wiki/Decorator_pattern). –

risposta

2

Il problema è che la generazione corretta dei collegamenti richiede la conoscenza del contesto all'interno del quale vengono generati, il che a sua volta significa che i semplici intercettori JAXB non eseguiranno il lavoro: semplicemente non sapranno quale URL inserire. Inoltre, la generazione dei link successivi e precedenti richiede di sapere quali sono questi valori; probabilmente non è sicuro dire che sono consecutivi, in quanto ciò implicherebbe una risorsa che modifica il proprio URL quando viene eliminata un'altra risorsa, il che sarebbe una follia.

Il metodo più sicuro e semplice sarà una classe wrapper (con annotazioni di serializzazione JAXB su di essa) che delega al livello DAO le informazioni di cui ha bisogno. Mentre questo può essere una buona quantità di codice da scrivere, è almeno facile ottenere tale codice giusto. La decorazione automatizzata di fantasia sarà molto più difficile.

0

RESTEasy ha il supporto per collegamenti tramite link atom o header. Esistono alcune annotazioni aggiuntive con cui è possibile puntare i servizi collegati. Vedere il capitolo 8 della documentazione RESTEasy.

Problemi correlati