【发布时间】:2014-10-30 17:40:42
【问题描述】:
我正在使用 Spring Framework 4.1.0 和 Spring HATEOAS 0.16.0 来开发 Spring Web 应用程序和该应用程序的 Spring 测试客户端。
测试客户端有如下语句:
ResponseEntity<Resource<Calculation>> response = restTemplate.exchange(
calculationsUri,
HttpMethod.POST,
new HttpEntity<Calculation>(calculation),
new ParameterizedTypeReference<Resource<Calculation>>()
);
...其中Calculation 是带有Jackson 注释的POJO(例如@JsonProperty)。
没有 CURIE,RestTemplate.exchange() 调用成功:response.getBody().getLinks() 返回一个非空非空的 List<Link> 实例。
我的 Web 应用程序具有非标准链接关系,例如“子计算”。我想使用 CURIE。
使用 CURIE,RestTemplate.exchange() 调用失败:响应反序列化代码抛出 org.springframework.http.converter.HttpMessageNotReadableException,由 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 引起:
'无法读取 JSON:无法识别的字段“名称”(类 org.springframework.hateoas.Link),未标记为可忽略(一个已知属性“href”])'
特别是,Jackson 无法将响应 JSON 中的 _links 映射中的 CURIE 反序列化到 List<Link> 类型字段 org.springframework.hateoas.ResourceSupport.links。响应 JSON 如下所示:
{
"_links" : {
"self" : {
"href" : "..."
},
"myNamespace:sub-calculations" : [ {
"href" : "..."
}, {
"href" : "..."
} ],
"curies" : [ {
"href" : ".../{rel}",
"name" : "myNamespace",
"templated" : true
} ]
}
}
我如何使用RestTemplate.exchange() 来获取其HAL+JSON ("application/hal+json") 表示使用CURIE 的资源?
【问题讨论】:
-
客户端是否包含Spring HATEOAS?
-
@zeroflagL:是的,客户端包括 Spring HATEOAS。
-
我不认为 Spring hatoas 与 Spring 4 兼容。
-
按照您的问题...为什么需要使用 CURIE?它们没有向 HAL 添加功能(除了只是缩短 URI 以提高可读性),而且对围绕所有 HATEOAS 框架的 CURIE 的支持非常参差不齐。 Traverson 和 Spring HATEOAS 也不例外。
-
CURIE 实际上并没有给您带来这种优势。 CURIE 名称是 JSON 文档的本地名称,可以是任何名称。可以将其完全视为 XML 命名空间前缀。 CURIE 所做的唯一一件事就是提高 API 开发人员的可读性。
标签: spring jackson deserialization spring-hateoas curie