【问题标题】:Link equivalent to @InjectLink of jersey链接相当于球衣的@InjectLink
【发布时间】:2015-11-05 10:33:47
【问题描述】:

我正在尝试使用(标准)链接方法为不同的资源/方法构建动态表示。 对我来说工作得很好的@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/dayhttp://localhost:8080/3/day 这不是资源和方法表示的完整(全局)路径,而是从链接所在位置看到的路径,即我试图获取/myresource/graphs 返回的实体内部的路径。在不使用硬编码路径部分的情况下,如何使用标准 Jax-RS 链接构建器获得 @InjectLink 注释的等效路径? 作为参考,目标资源的正确完整路径是http://localhost:8080/myresource/graphs/3/day

【问题讨论】:

    标签: java rest jax-rs jersey-2.0


    【解决方案1】:

    预期行为:“请注意,传递给此方法返回的 Link.Builder 实例的链接 URI 是相对的。” (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Link.html)

    一种可能性是使用 UriBuilder 和 / 作为 basePath。

    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"));
    

    【讨论】:

    • 感谢您的出色回答!正是我想要的!
    猜你喜欢
    • 2016-01-03
    • 2013-08-11
    • 1970-01-01
    • 2015-05-18
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多