【问题标题】:Jersey 2 - centralized link resolverJersey 2 - 集中式链接解析器
【发布时间】:2014-08-13 17:19:09
【问题描述】:

在工作中,我们为许多 REST API 提供服务,并且我们的代码库以相当有机的方式增长。 我们主要以rome:rome:1.0 artefact 服务ATOM+XML。因此,我们所有的资源方法都返回一个SyndFeed

我们在 Jersey 2 中遇到的主要问题(在升级之前,我们在 Jersey 1.x 中也遇到过)是我们还没有找到一种方法来分离服务内容(资源的责任)和创建这些内容之间的关注点 超链接内容(我们业务层的职责+解析器尚未确定)。

现在,每个资源负责:

  1. 将我们的业务对象映射到它们的SyndFeed 表示
  2. 因此,解决所有自身/相关/内联链接也由资源直接完成

第 2 点目前是通过 Jersey 管理的 UriInfo(通过 @Context)实现的,从中派生了许多在公共资源超类中定义的垃圾 URI 解析器方法。

UriInfo 目前需要它的getBaseUriBuilder() 方法,允许我们构造路径。

因为 UriInfo 是 Jersey 管理的 bean,所以无法将所有这些 URI 解析器方法提取到一个或多个独立解析器中。 由于这个限制,目前没有办法从资源类中提取超链接内容创建(而是:一个永远增长的垃圾资源超类)。

到目前为止,您可能会想到 Jersey 2 的 declarative hyperlinking feature。 但是,据我了解文档,此功能在我的上下文中不起作用。事实上,@InjectLink 只能由 Resource 结果 bean 使用,并且我们的资源仅返回 SyndFeed 的实例,这是来自 rome:rome:1.0 的类!

是否有任何已知的非托管(即独立于 Jersey HK2)集中式服务来解决链接,还是我必须自己推出?

【问题讨论】:

    标签: java rest hyperlink jersey-2.0


    【解决方案1】:

    主要问题是“链接在资源中的位置”:

    1. 在资源本身中,如github API 中的 _url 字段,对于 json/xml 很常见
    2. 在 HTTP“链接”标头中,这可能更适合于不允许在资源本身中嵌入链接的表示形式:图像、二进制文件...

    您当前的球衣资源方法返回一个 SyndFeed 对象,但您应该能够:

    • 将其包装在另一个对象中,允许定义“链接”部分
    • 为该对象类型编写自定义提供程序
    • 调用支持 SyndFeed 的现有提供程序以避免自己重写它

    另外,如果你让你的资源在那个数据结构中注入 UriInfo,你就拥有了编写链接所需的一切:

    • UriInfo用于获取base URL(由jersey注入)
    • UriBuilder 用于解析基础/资源 URL 路径
    • 资源链接的“业务定义”

    在这种情况下,提供者只需要“遵循链接定义中的内容”并且没有业务逻辑。提供此类信息是资源的责任,您也可以委托给您选择的其他班级。

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2011-12-08
      • 2012-03-25
      • 2017-09-13
      • 2011-03-14
      相关资源
      最近更新 更多