为特定单个资源生成集合资源链接

Generate links for collection resources for a specific single resource

我编写了一个自定义控制器来处理 GET http://localhost:54000/api/v1/portfolios/{id}/evaluate 请求。

@RequestMapping(value = "/portfolios/{id}/evaluate", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> evaluate(@PathVariable Long id) {
    Portfolio portfolio = portfolioService.evaluate(id);
    if (portfolio == null) {
        return ResponseEntity.notFound().build();
    }
    Resource<Portfolio> resource = new Resource<>(portfolio);
    resource.add(entityLinks.linkForSingleResource(Portfolio.class, id).withSelfRel());
    return ResponseEntity.ok(resource);
}

当前回复是

{
  "summary" : {
    "count" : 24.166666666666668,
    "yield" : 0.14921630094043895,
    "minBankroll" : -6.090909090909091,
    "sharpeRatio" : 0.7120933654645042,
    "worstReturn" : -2.4545454545454533,
    "losingSeason" : 3,
    "return" : 3.6060606060606077
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:54000/api/v1/portfolios/4"
    }
  }
}

但我想添加链接到该投资组合的馆藏资源(摘要和系统):

{
  "summary": {
    "count": 24.166666666666668,
    "yield": 0.14921630094043895,
    "minBankroll": -6.090909090909091,
    "sharpeRatio": 0.7120933654645042,
    "worstReturn": -2.4545454545454533,
    "losingSeason": 3,
    "return": 3.6060606060606077
  },
  "_links": {
    "self": {
      "href": "http://localhost:54000/api/v1/portfolios/4"
    },
    "portfolio": {
      "href": "http://localhost:54000/api/v1/portfolios/4"
    },
    "summaries": {
      "href": "http://localhost:54000/api/v1/portfolios/4/summaries"
    },
    "systems": {
      "href": "http://localhost:54000/api/v1/portfolios/4/systems"
    }
  }
}

我没有找到使用 RepositoryEntityLinks 实体链接对象生成这些链接的方法

你总是可以这样做:

entityLinks.linkForSingleResource(Portfolio.class, id).slash("systems").withRel("systems");

如果您的系统端点是在自定义控制器方法中实现的,您可以使用 ControllerLinkBuilder 为您的控制器方法生成 link。假设您在 MyControllerClass 中使用 id 参数实现了 getSystems 方法 - 那么您可以像这样生成 link(linkTo 和 methodOn 是 ControllerLinkBuilder 中的静态方法):

linkTo(methodOn(MyControllerClass.class).getSystems(id)).withRel("systems");