Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey声明性超链接@Ref注释使用_Java_Rest_Annotations_Jersey_Hypermedia - Fatal编程技术网

Java Jersey声明性超链接@Ref注释使用

Java Jersey声明性超链接@Ref注释使用,java,rest,annotations,jersey,hypermedia,Java,Rest,Annotations,Jersey,Hypermedia,我一直在尝试扩展Jersey 1.12文档第6章(声明性超链接)中提供的示例,但似乎在@Ref注释的使用方面遇到了障碍 我的代码如下: @Path("/offerings/{offeringId}/widgets") @Produces(MediaType.APPLICATION_JSON) public class WidgetsResource { @GET @Path("/{widgetId}") public Response get(@PathParam("offering

我一直在尝试扩展Jersey 1.12文档第6章(声明性超链接)中提供的示例,但似乎在@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;
    }
}
@Path(“/offices/{offeringId}/widgets”)
@产生(MediaType.APPLICATION_JSON)
公共类WidgetsResource{
@得到
@路径(“/{widgetId}”)
公共响应get(@PathParam(“offeringId”)字符串offeringId,@PathParam(“widgetId”)字符串widgetId){
Widgets Widgets=newwidgets();
setOfferingId(Integer.valueOf(offeringId));
Widget Widget=newwidget();
setId(Integer.valueOf(widgetId));
setWidgets(Arrays.asList(widget));
返回Response.status(200).entity(widgets.build();
}
}
公共类小部件{
@Ref(resource=WidgetsResource.class,style=style.ABSOLUTE)
URI;
@杰索尼奥雷
私人信息提供ID;
私人收藏小部件;
公共集合getWidgets(){
返回窗口小部件;
}
公共void集合小部件(集合小部件){
this.widgets=widgets;
}
公共URI getUri(){
返回uri;
}
public int getOfferingId(){
返回报价ID;
}
公共无效setOfferingId(int id){
this.offeringId=id;
}
}
公共类小部件{
@Ref(resource=WidgetsResource.class,style=style.ABSOLUTE,绑定={
@绑定(name=“offeringId”,value=“${entity.offeringId}”)}
)
URI;
私有int-id;
公共URI getUri(){
返回uri;
}
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
}
这适用于为Widgets集合对象的实例生成的URL:

"uri": "http://localhost:65080/<app>/offerings/9999/widgets"
“uri”:http://localhost:65080//offerings/9999/widgets"
但是,我想知道如何将集合中小部件实例的id附加到每个小部件的URL。因此,生成的URI类似于:

"uri": "http://localhost:65080/<app>/offerings/9999/widgets/1234"
“uri”:http://localhost:65080//offerings/9999/widgets/1234"
如果不在Widget类中硬编码整个路径值,我似乎无法找到使用Ref注释来实现这一点的方法,如果可能的话,我希望避免这样做


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

我读到的文档中说,您可以这样做(未经测试!):


您应该仍然能够使用这种方法进行绑定,尽管这里的悲剧是,您现在在表示需要子资源URI的每个位置复制硬编码路径。如果您在一个大型应用程序中执行的是真实的或接近真实的REST,那么如果这些URI发生变化,这可能会是一个巨大的麻烦。
@Ref(value="/offerings/{offeringId}/widgets/{widgetId}", style=ABSOLUTE)
URI uri;