2012-03-08 17 views
7

He intentado ampliar el ejemplo proporcionado en el Capítulo 6 (Hipervínculos declarativos) de la documentación de Jersey 1.12, pero parece haber topado con una pared con respecto al uso de la anotación @Ref .Java Jersey Declarative Hyperlinking @Ref Annotation Use

Mi código es el siguiente:

@Path("/offerings/{offeringId}/widgets") 
@Produces(MediaType.APPLICATION_JSON) 
public class WidgetsResource { 
    @GET 
    @Path("/{widgetId}") 
    public Response get(@PathParam("offeringId") String offeringId, @PathParam("widgetId") String widgetId) { 
    Widgets widgets = new Widgets(); 
    widgets.setOfferingId(Integer.valueOf(offeringId)); 
    Widget widget = new Widget(); 
    widget.setId(Integer.valueOf(widgetId)); 
    widgets.setWidgets(Arrays.asList(widget)); 
    return Response.status(200).entity(widgets).build(); 
    } 
} 

public class Widgets { 
    @Ref(resource = WidgetsResource.class, style=Style.ABSOLUTE) 
    URI uri; 
    @JsonIgnore 
    private int offeringId; 
    private Collection<Widget> widgets; 

    public Collection<Widget> getWidgets() { 
     return widgets; 
    } 

    public void setWidgets(Collection<Widget> widgets) { 
     this.widgets = widgets; 
    } 

    public URI getUri() { 
     return uri; 
    } 

    public int getOfferingId() { 
     return offeringId; 
    } 

    public void setOfferingId(int id) { 
     this.offeringId = id; 
    } 
} 

public class Widget { 
    @Ref(resource = WidgetsResource.class, style=Style.ABSOLUTE, bindings={ 
    @Binding(name="offeringId", value="${entity.offeringId}")} 
    ) 
    URI uri; 
    private int id; 

    public URI getUri() { 
     return uri; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

Esto funciona muy bien para la URL generada para una instancia del objeto de colección Reproductores:

"uri": "http://localhost:65080/<app>/offerings/9999/widgets" 

Sin embargo, me gustaría saber cómo puedo añadir la identificación de las instancias de widget dentro de la colección de la URL para cada widget. Por lo tanto, el URI generado sería algo así como:

"uri": "http://localhost:65080/<app>/offerings/9999/widgets/1234" 

Me parece que no puede encontrar una manera de utilizar los Ref anotación para lograr esto sin empezar a codificar todo el valor de ruta dentro de la clase Widget, que yo' Me gustaría evitar si es posible.

¿Hay una forma estándar de lograr esto?

Respuesta

1

Mi lectura de la documentación que se dice que podría hacer algo como esto (no probado!):

@Ref(value="/offerings/{offeringId}/widgets/{widgetId}", style=ABSOLUTE) 
URI uri; 
+1

aún debe ser capaz de hacer los enlaces con este enfoque, aunque la tragedia aquí es que eres ahora duplicar la ruta codificada en un solo lugar donde una representación necesita un URI de sub recursos. Si está haciendo REST verdadero o casi verdadero en una aplicación grande, esto podría ser una gran molestia si esos URI alguna vez cambian. – Patrick

Cuestiones relacionadas