泽西2 - 集中链接解析器

时间:2014-08-13 17:19:10

标签: java rest hyperlink jersey-2.0

在工作中,我们提供许多REST API,我们的代码库已经以非常有机的方式发展。 我们主要使用rome:rome:1.0 artefact提供ATOM + XML。因此,我们所有的资源方法都返回SyndFeed

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

现在,每个资源都负责:

  1. 将我们的业务对象映射到他们的SyndFeed表示
  2. 因此,解决所有自我/相关/内联链接也由资源直接完成
  3. Point 2目前通过Jersey管理的UriInfo(通过@Context)实现,从中派生出许多垃圾URI解析器方法,这些方法在公共资源超类中定义。

    目前,UriInfo方法需要{p> getBaseUriBuilder(),允许我们构建路径。

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

    截至目前,您可能会想到泽西2的declarative hyperlinking feature。 但是,据我所知,这个功能在我的上下文中不起作用。实际上,@InjectLink只能由资源结果bean使用,而我们的资源只返回SyndFeed的实例,rome:rome:1.0的类!

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

1 个答案:

答案 0 :(得分:0)

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

  1. 在资源本身内,如github API中的_url字段,对json / xml来说很常见
  2. 在HTTP“链接”标题中,这可能更适合不允许在资源本身内嵌入链接的表示:图像,二进制文件,......
  3. 您当前的球衣资源方法会返回一个SyndFeed对象,但您应该能够:

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

    另外,如果您使资源在该数据结构中注入UriInfo,那么您拥有编写链接所需的一切:

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

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