我正在尝试使用(标准)链接方法来构建不同资源/方法的动态表示。 对我来说非常好的@InjectLink注释是
public class InjectLinkTest {
@InjectLink(resource = GraphResource.class, method = "getDataInterval", bindings = { @Binding(name = "dataid", value = "${instance.id}"), @Binding(name = "interval", value = "day") }, condition = "${instance.id != null}")
public URI day;
// ...
}
这构建了预期的资源和方法的相对链接:/myresource/graphs/3/day
现在我想用更标准的方法使用Jax-RS'默认Link
来做相同的事情:
public class StandardLinkTest {
public URI day = Link.fromMethod(GraphResource.class, "getDataInterval").build(this.id, "day").getUri();
// ...
}
我尝试了不同的选项(手动设置应用程序的基本URI等),但由于某种原因,它永远不会为我返回正确的URI。我得到的只是3/day
或http://localhost:8080/3/day
,它不是资源和方法表示的完整(全局)路径,但是从构建链接的位置看到的路径,即我正试图获取/myresource/graphs
返回的实体内部的路径。如何在不使用硬编码路径部分的情况下,使用标准Jax-RS链接构建器获取@InjectLink
注释的等效路径?
作为参考,目标资源的正确完整路径为http://localhost:8080/myresource/graphs/3/day
。
答案 0 :(得分:1)
预期行为:“请注意,传递给此方法返回的Link.Builder实例的链接URI是相对的。” (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Link.html)
一种可能性是使用带有/作为basePath的UriBuilder。
UriBuilder.fromPath("/").path(GraphResource.class, "getDataInterval").build(this.id, "day").getUri();
注意:如果您对编译时安全链接创建感兴趣,请参阅此处:https://github.com/upsource/jersey-linking/ 用法(Java-8):
@Inject
private Linker linker;
...
linker.link(GraphResource.class, (o) -> o.getDataInterval(this.id, "day"));