使用 spring 读取带有嵌入式 HAL 集合的 hateoas 响应

Read hateoas response with embedded HAL collection with spring

我正在尝试阅读像这样的 REST HATEOAS 回复:

{
  "_embedded": {
    "tasks": [
      {
        "id": 1,
        "name":"task1"
        "_links": {
          "self": {
            "href": "http://localhost:8080/v1/tasks/1"
          },
          "tasks": {
            "href": "http://localhost:8080/v1/tasks"
          }
        }
      }
    ]
  },
  "_links": {
    "self": {
      "href": "http://localhost:8080/v1/tasks?page=0&size=1"
    }
  },
  "page": {
    "size": 1,
    "totalElements": 1,
    "totalPages": 1,
    "number": 0
  }
}

我正在尝试遵循 spring 文档的示例:spring hateoas traverson

Java代码:

...
TypeReferences.ResourcesType<Resources<Task>> resourceParameterizedTypeReference = new TypeReferences.ResourcesType<Resources<Task>>(){};

Traverson traverson = new Traverson(new URI("http://localhost:8080/v1/tasks"), MediaTypes.HAL_JSON);

Traverson.TraversalBuilder builder = traverson.follow(rel("tasks")).withHeaders(headers);

Resources<Resources<Task>> taskResources = builder.toObject(resourceParameterizedTypeReference);
...

但是我得到这个错误:

Did not find LinkDiscoverer supporting media type text/html!

原因:"follow(rel("任务"))" 找不到 "tasks"。

我正在尝试像这样的其他解决方案: ,我也报错"Expected to find link with rel ..."。

也许最后我不明白使用 traverson 对象的正确方式。

我通过自己解析 Json 中的响应来解决我的问题,但它们是另一种获取 bean 列表中“_embedded”标签中包含的列表的方法吗?

如果你有一些例子我很感兴趣:)。

我认为您需要使用 Json 路径表达式来访问嵌入的内容。

Traverson.TraversalBuilder builder = traverson.follow("$._embedded.tasks[0]").withHeaders(headers);

Resources<Resources<Task>> taskResources = builder.toObject(resourceParameterizedTypeReference);

以下工具可用于处理路径表达式:http://www.jsonquerytool.com/

顺便说一句,您的 JSON 在 "name" 之后缺少一个“,”。