【问题标题】:Exchanging Spring Hypermedia Resources with HAL+JSON CURIEs via RestTemplate通过 RestTemplate 用 HAL+JSON CURIE 交换 Spring 超媒体资源
【发布时间】: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&lt;Link&gt; 实例。

我的 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&lt;Link&gt; 类型字段 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


【解决方案1】:

看起来该库根本不支持 HAL 链接对象 https://datatracker.ietf.org/doc/html/draft-kelly-json-hal-06#section-5.5 的名称字段 ...实际上与 CURIE 没有任何关系。您应该打开该库的问题以支持 HAL 链接对象的所有字段。

就您的示例中的 CURIE @CCCV 而言,无论 CURIE 是否存在,它们的关键是 AWALYS myNamespace:sub-calculations。 CURIE 只是让您取消对应该链接到文档的 URL 的引用。这有点奇怪,我看到实现总是认为 URI 很重要。见https://groups.google.com/d/msg/hal-discuss/lt0CnC3eev4/YinN1Us54KcJ我不是说我同意它..但这就是它应该的样子

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多