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?
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. –
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
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). –