2012-03-08 65 views
7

我一直试图扩展泽西岛1.12文档的第6章(声明性超链接)中提供的示例,但似乎已经击中了关于使用@Ref注释。Java泽西声明性超链接@Ref注释使用

我的代码如下:

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

这工作正常的Widgets集合对象的实例生成的网址:

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

不过,我想知道我可以追加Collection中的Widget实例的ID添加到每个Widget的URL中。因此,URI产生会是这样的:似乎

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

我无法找到使用参考注解的方式来实现这一点没有开始Widget类中硬编码的整个路径值,这是我”如果可能,d喜欢避免。

是否有一个标准的方法来实现这一目标?

回答

1

我该文档的阅读说你可以做这样的事情(未经测试!):

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

您应该还是可以用这种方法做绑定,虽然这里的悲剧是,你现在在表示需要子资源URI的每一个地方复制硬编码路径。如果您在大型应用程序中执行真正的或接近真实的REST,如果这些URI发生更改,这可能会非常麻烦。 – Patrick 2013-02-22 16:51:00