2012-01-16 21 views
5

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?

+0

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

+0

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

+2

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

Respuesta

2

El problema es que la generación correcta de los enlaces requiere conocer el contexto en el que se generan, lo que a su vez significa que los simples interceptores JAXB no harán el trabajo: simplemente no sabrán qué URL insertar. Además, generar los enlaces siguiente y anterior requerirá saber cuáles son esos valores; probablemente no sea seguro decir que son consecutivos, ya que eso implicaría que un recurso cambia su URL cuando se elimine algún otro recurso, lo que sería una locura.

El método más seguro y fácil va a ser una clase contenedora (con anotaciones de serialización JAXB) que delegue en la capa DAO la información que necesita. Si bien esta puede ser una buena cantidad de código para escribir, al menos es fácil obtener dicho código correctamente. La decoración automatizada de lujo será mucho más difícil.

0

RESTEasy tiene soporte para enlaces ya sea a través de un átomo o enlaces de encabezado. Hay algunas anotaciones adicionales mediante las cuales puede señalar los servicios vinculados. Ver el capítulo 8 de la documentación RESTEasy.

Cuestiones relacionadas