【问题标题】:How do I export data in accordance to HAL spec?如何按照 HAL 规范导出数据?
【发布时间】:2018-01-22 17:46:44
【问题描述】:

根据this 规范,以 hal+json 格式公开数据的应用程序应在 _links json 字段中提供嵌入式链接。但是,如果我像这样在 spring-data 1.5.9 中声明我的 REST 存储库:

@RepositoryRestResource(path = "storage-node", excerptProjection = IBrief.class)
public interface IStorageNodeRepository extends JpaRepository<StorageNode, Long> {
  @Query("FROM StorageNode sn WHERE sn.parent is null order by sn.uploadTs ASC")
  List<StorageNode> findAllRootNodes();
}

我得到以下 json:

{
  "nodeType" : "Image",
  "text" : "100.jpeg",
  "uploadTs" : "2018-01-11T23:48:25.724Z",
   /* ... Irrelevant ... */
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080/emerald/api/hal/storage-node/31"
  }
  /* ... Irrelevant ... */
}

正如我们所见,它在“链接”字段中导出链接,没有前导下划线。是否需要额外配置才能按照 HAL 规范导出数据?

【问题讨论】:

    标签: spring-data hateoas spring-hateoas


    【解决方案1】:

    经过一番思考,我发现了这个片段。

      @Bean
      public RepositoryRestConfigurer repositoryRestConfigurer() {
        return new RepositoryRestConfigurerAdapter() {
          @Override
          public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
            config.setBasePath("/api/hal");
            config.setDefaultMediaType(MediaType.APPLICATION_JSON_UTF8);
          }
        };
      }
    

    删除默认媒体类型完成了这项工作。 我不记得我在什么情况下添加了这个。也许我必须在每个回复中明确地说;charset=utf8 才能处理俄语字符串。

    【讨论】:

    • 我认为它应该仍然适用于没有默认媒体类型的俄语字符。响应具有标题:Content-Type: application/hal+json;charset=UTF-8 我已经在 github.com/dwdking/hal-test 更新了测试应用程序,以包含一个带有一些俄语字符的条目,它似乎正确显示
    【解决方案2】:

    我不相信 Spring HATEOAS 不会开箱即用 HAL。您可以通过将以下内容添加到您的配置来启用它:

    @EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
    

    查看类似问题heredocs

    如果您使用的是 spring boot,则 application.properties 中的相关配置将是(尽管我相信这在至少 1.5.9 的引导中默认为 true):

    spring.hateoas.use-hal-as-default-json-media-type: true
    

    【讨论】:

    • 你使用的是什么版本的 Spring HATEOAS,注解在哪里?
    • 版本在帖子中。注释应用于@Configuration bean
    • 您提供的问题链接描述了编写启用 HATEOAS 的自定义 REST 服务。我没有在这里编写自己的服务(当结果包装在 Resource 中时,它们按预期返回 _links,顺便说一句),问题出在内置控制器上。
    • 这和你的配置有关。我在这里的示例项目中没有看到类似的问题:github.com/dwdking/hal-test您可以在某处发布源代码或在最小示例中创建问题吗?
    • config.setDefaultMediaType(MediaType.APPLICATION_JSON_UTF8);
    猜你喜欢
    • 2011-01-11
    • 2020-03-13
    • 1970-01-01
    • 2016-12-27
    • 2012-02-04
    • 1970-01-01
    • 2020-04-24
    • 2014-09-06
    • 2019-01-22
    相关资源
    最近更新 更多