Tenemos una aplicación web de servidor Java donde el núcleo del sistema contiene un modelo de dominio muy complejo que fue diseñado de acuerdo con los principios del diseño impulsado por dominio. En su mayor parte, estos objetos de dominio han sido muy poco por las otras aplicaciones.¿Cuál es la mejor manera de implementar relaciones de enlace para HATEOAS en XML?
Ahora estamos buscando poner una API de servicios web REST en frente del sistema y estoy luchando con la mejor manera de implementar los enlaces HATEOAS que se encuentran dentro de nuestro propio tipo de medio. Por ejemplo, digamos que tenemos la clase de dominio foo
que tiene un ID y nombre de propiedades con anotaciones 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;
}
}
Pero el XML quiero devolver el aspecto siguiente:
<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>
¿Cuál es ¿La mejor manera de hacerlo es que no haya contaminado el diseño de mi dominio con estos enlaces de tipo de medio, pero todavía puedo usar el poder de JAX-B para la clasificación de XML? Aquí hay algunos pensamientos:
1) Adaptadores JAX-B - podría usarlos para modificar el XML de las entidades e insertar los enlaces ... ¿es posible? es razonable? ¿Algún ejemplo?
2) DTO Layer - Crea una nueva capa de servicio REST que convierta mis objetos de dominio en DTOs. Hasta ahora hemos sido capaces de evitar la molestia de los DTO. Si bien esto proporcionaría una flexibilidad total en lo que le devolvemos al cliente, tampoco estoy buscando crear clientes agnósticos de dominio aquí.
3) Cabeceras de enlace - Me gusta mucho esta idea, pero no creo que funcione (por sí sola) porque a veces nuestros recursos contienen colecciones de sub recursos. En este caso, los subrecursos tendrán que organizarse en XML que contenga enlaces/hrefs, etc. Por lo tanto, mientras que los encabezados de los enlaces resuelven el problema al tipo de nivel superior, no resuelve todo el problema. Siéntase libre de decir lo contrario!
¿Hay algún otro enfoque que me ayude a evitar los DTO y, sin embargo, siga siendo transparente para el modelo de dominio?
Agregar enlaces al modelo requiere extender sus clases de dominio, pero luego su capa DAO no puede instanciar tales objetos. Considere agregar y agregar JAXB (o cualquier mapeo XML) a esa capa. –
Si lo entiendo, cree un modelo REST que agregue los objetos de dominio con los enlaces y envíelos. Algo así como un DTO, pero más como extender el dominio para incluir enlaces. ¿Entiendo? – HDave
Sí, crearía envolturas. Si es necesario, delegando las llamadas a objetos DAO. Así que, básicamente, eso es [patrón de diseño del decorador] (http://en.wikipedia.org/wiki/Decorator_pattern). –