簡體   English   中英

來自 Hateos 的返回鏈接

[英]Return link from Hateos

我有這個舊的 Spring Hateos 代碼,我想遷移到最新版本:

    Map<String, Link> links = new HashMap<>();

    links.put(Link.REL_NEXT, response.getLink(Link.REL_NEXT));
    links.put(Link.REL_PREVIOUS, response.getLink(Link.REL_PREVIOUS));

    addLink(url, response, links, Link.REL_NEXT);
    addLink(url, response, links, Link.REL_PREVIOUS);

  ....

    private void addLink(String baseUrl, WebResource response, Map<String, Link> links, String rel) {
    if (links.get(rel) == null) {
      return;
    }
    Link link = links.get(rel);
    String href = baseUrl;
    if (link.getHref().contains("?")) {
      href = href + link.getHref().substring(link.getHref().indexOf('?'));
    }
    link = Link.of(href, rel);
    response.add(link);
  }

我試過這個:

    Map<LinkRelation, Optional> links = new HashMap<>();


    links.put(IanaLinkRelations.SELF, response.getLink(IanaLinkRelations.SELF));

    links.put(IanaLinkRelations.NEXT, response.getLink(IanaLinkRelations.NEXT));

    links.put(IanaLinkRelations.PREVIOUS, response.getLink(IanaLinkRelations.PREVIOUS));


    addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.SELF);

    addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.NEXT);

    addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.PREVIOUS);


private void addLink(String baseUrl, RegistrationsResource response, Map<LinkRelation, Optional> links, LinkRelation rel) {
    if (links.get(rel) == null) {
      return;
    }
    Link link = links.get(rel);
    String href = baseUrl;
    if (link.getHref().contains("?")) {
      href = href + link.getHref().substring(link.getHref().indexOf('?'));
    }
    link = Link.of(href, rel);
    response.add(link);
  }

我在這一行得到錯誤:

Link link = links.get(rel);

Required type:  Link
Provided:       Optional

你能告訴我實現這個的正確方法是什么嗎?

根據您對遷移的評論和問題,這就是我的建議:

Map<LinkRelation, Optional<Link>> links = new HashMap<LinkRelation, Optional<Link>>();

links.put(IanaLinkRelations.SELF, Optional.of(response.getLink(IanaLinkRelations.SELF)));

links.put(IanaLinkRelations.NEXT, Optional.of(response.getLink(IanaLinkRelations.NEXT)));

links.put(IanaLinkRelations.PREVIOUS, Optional.of(response.getLink(IanaLinkRelations.PREVIOUS)));

……

//調用addLinlk

addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.SELF);

addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.NEXT);

addLink(apmCoreBaseUrl, response, links, IanaLinkRelations.PREVIOUS);

在 addLink 內部:

private void addLink(String baseUrl, RegistrationsResource response, Map<LinkRelation, Optional> links, LinkRelation rel) {

    links.get(rel).ifPresent(x->{
     Link link = x;
     String href = baseUrl;
    if (link.getHref().contains("?")) {
      href = href + link.getHref().substring(link.getHref().indexOf('?'));
    }
    link = Link.of(href, rel);
    response.add(link);
    });
  }

使用 Java 11 和 spring-hateoas 1.5.0 測試。 如果您有任何不同的版本,請告訴我。

編輯

根據 OP 所述,他們使用的是 hatoas 版本2.6.7 OP 代碼中的response引用是擴展RepresentationModel的自定義類。 所以response.getLink(..)將返回Optional<Link>的類型。 因此,以下解決方法將起作用:

Map<LinkRelation, Optional<Link>> links = new HashMap<LinkRelation, Optional<Link>>();

links.put(IanaLinkRelations.SELF, response.getLink(IanaLinkRelations.SELF));

...

addLink無需更改,調用addLink無需更改,我的原始答案對其他操作仍然有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM