2012-03-08 16 views
7

Ho cercato di espandere l'esempio fornito nel capitolo 6 (Hyperlinking dichiarativo) della documentazione di Jersey 1.12 ma sembra che abbia colpito un muro per quanto riguarda l'uso dell'annotazione @Ref .Java Hyperlinking dichiarativo @Ref Annotation Usa

Il mio codice è il seguente:

@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; 
    } 
} 

Questo funziona bene per l'URL generato per un'istanza dell'oggetto insieme Widget:

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

Tuttavia, vorrei sapere come posso aggiungere l'ID delle istanze del widget all'interno della raccolta all'URL per ciascun widget. Così, l'URI generato sarebbe qualcosa di simile:

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

io non riesco a trovare un modo di usare i Rif annotazione per raggiungere questo obiettivo senza iniziare a codificare l'intero valore del percorso all'interno della classe Widget, che ho' Mi piacerebbe evitare se possibile.

Esiste un modo standard per raggiungere questo obiettivo?

risposta

1

La mia lettura di questa documentazione dice che si potrebbe fare qualcosa di simile (non testata!):

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

si dovrebbe comunque essere in grado di fare le Associazioni con questo approccio, anche se la tragedia è che sei ora duplicando il percorso hard coded in ogni singolo luogo che una rappresentazione ha bisogno di un URI di sub-risorsa. Se stai facendo REST vero o quasi vero in un'applicazione di grandi dimensioni, questo potrebbe essere un enorme problema se questi URI cambiano mai. – Patrick