7
Jersey 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;
}
}
これは、ウィジェットのコレクションオブジェクトのインスタンスの生成されたURLのために正常に動作します:
"uri": "http://localhost:65080/<app>/offerings/9999/widgets"
しかし、私は私が追加することができます方法を知りたいですCollection内のWidgetインスタンスのidを各ウィジェットのURLに変換します。だから、URIのようなものになるだろう生成:
"uri": "http://localhost:65080/<app>/offerings/9999/widgets/1234"
私は「これは、Widgetクラス内全体のパス値をハードコーディングするために起動せずにこれを達成するために参考アノテーションを使用する方法を見つけるように見えることはできません可能であれば避けたい。
これを達成するための標準的な方法はありますか?
ここ悲劇はあなたが今しているということですが、あなたはまだ、このアプローチでバインディングを行うことができるはず表現がサブリソースURIを必要とするあらゆる場所でハードコードされたパスを複製する。大規模なアプリケーションで本当のRESTやほぼ真のRESTを実行している場合、これらのURIが変わると大変面倒なことになります。 – Patrick