在JSON中禁用超文本应用程序语言(HAL)?

jpl*_*ain 37 rest json spring-data spring-data-jpa spring-data-rest

在版本2.0.2.RELEASE中使用带有JPA的Spring Data REST.

如何在JSON中禁用超文本应用程序语言(HAL)?http://stateless.co/hal_specification.html

我已经尝试了很多东西,但无济于事.例如,我已将Accept和Content-type标头设置为"application/json"而不是"application/hal + json",但我仍然收到带有超链接的JSON内容.

例如,我想得到类似的东西:

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"sector" : {
     "description" : "Marketing",
     "average profit": 545656665,
     "average employees": 75,
     "average profit per employee": 4556
     }
}
Run Code Online (Sandbox Code Playgroud)

代替:

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"_links" : {
     "self" : {
          "href" : "http://localhost:8080/app/companies/1"
     },
     "sector" : {
          "href" : "http://localhost:8080/app/companies/1/sector"
     }
}
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Oli*_*ohm 36

(超)媒体类型

Spring Data REST的默认设置使用HAL作为默认的超媒体表示格式,因此服务器将为给定的Accept标头返回以下内容:

  • 没有标题 - > application/hal+json- > HAL
  • application/hal+json- > application/hal+json- >哈尔
  • application/json- > application/json- > HAL(这是默认配置)
  • application/x-spring-data-verbose+json- > application/x-spring-data-verbose+json- > Spring Data特定格式(links用于链接容器和content集合项的包装器).

如果配置RepositoryRestConfiguration.setDefaultMediaType(…)为非HAL格式,则服务器将返回特定于Spring Data的JSON格式,除非您明确要求application/hal+json.不可否认,配置选项可能有点误导,所以我提交了DATAREST-294以改进这一点.这个问题在2.1 RC1(Dijkstra)2014中得到了解决.

请注意,我们实际上需要一种超媒体格式,以便能够表达托管资源之间的关系并实现服务器的可发现性.所以你无法完全摆脱它.这主要是因为如果您公开具有双向关系的实体或构成一个巨大的对象图,您可能很容易崩溃服务器.

内联相关实体

如果您从不希望将扇区链接到并始终内联它们,那么一个选项就是首先将其SectorRepository从导出为REST资源中排除.您可以通过使用注释存储库接口来实现此目的@RepositoryRestResource(exported = false).

要在下面的示例中发布返回的表示,请查看Spring Data REST 2.1 M1中引入的投影功能.它基本上允许您通过简单的接口在资源上创建可以与默认视图不同的视图.

你基本上定义了一个接口:

@Projection(name = "foo", types = YourDomainClass.class)
interface Inlined {

  // list all other properties

  Sector getSector();
}
Run Code Online (Sandbox Code Playgroud)

如果您将此接口放入域类的(子)包中或通过RepositoryRestConfiguration.projectionConfiguration()资源手动注册它,YourDomainClass则接受请求参数,projection以便foo在此示例中传入将根据需要呈现内联表示.

此提交通常具有关于该功能的更多信息,此提交具有定义的示例投影.

  • 有可能完全禁用?我想只检索实体ID的JSON. (15认同)
  • 关于SDR的超媒体性质的问题在于简单的休息apis(即richardson成熟度模型的第2级)是主流且经过生产验证的.评审团仍然关注超媒体API的可用性(第3级).将SDR与超级媒体联系似乎将其谴责为实验状态,这对任何需要生产就绪API的人来说都是一个艰难的卖点 - 或者我错过了什么? (12认同)
  • 难道你不觉得那有点傻吗?如果我有100个模型,我需要创建100个投影.我不这么认为.我正在寻找一个配置标志,让我发送Json或HalJson而不是HalJson (7认同)
  • 这可能是由反射API以不同的顺序返回方法引起的.但是,投影界面是通过Jackson注释打开进行自定义的,因此`@JsonPropertyOrder`应该允许您根据需要自定义内容. (2认同)