使用 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" 之后缺少一个“,”。
我正在尝试阅读像这样的 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"。
我正在尝试像这样的其他解决方案:
也许最后我不明白使用 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" 之后缺少一个“,”。