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

在版本2.0.2.RELEASE中使用Spring Data REST和JPA。

如何禁用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 } } 

代替:

 { "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" } } } 

谢谢你的帮助。

(超)媒体types

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

  • 没有标题 – > application/hal+json – > HAL
  • application/hal+json – > application/hal+json – > HAL
  • application/json – > application/json – > HAL(这是默认configuration)
  • application/x-spring-data-verbose+json > application/x-spring-data-verbose+json – >一个Spring Data的特定格式(使用链接容器和content作为收集项的包装器。

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

请注意,我们有效地需要一个超媒体格式,以便能够expression托pipe资源之间的关系,并使服务器具有可发现性。 所以你不可能完全摆脱它。 这主要是由于如果您暴露具有双向关系的实体或构成巨大的对象图,您可能容易使服务器崩溃。

内联相关实体

如果您永远不希望将扇区链接到并且始终将它们内联,则一种方法是首先将SectorRepository从导出为REST资源中排除。 你可以通过使用@RepositoryRestResource(exported = false)注解存储库接口来实现这一点@RepositoryRestResource(exported = false)

为了得到在下面的例子中发布的expression式,请看Spring Data REST 2.1 M1中引入的投影特性。 它基本上允许你通过一个简单的界面在资源上创build可选的视图,这些视图可以与默认的视图不同。

你基本上定义一个接口:

 @Projection(name = "foo", types = YourDomainClass.class) interface Inlined { // list all other properties Sector getSector(); } 

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

这个提交通常有更多关于这个特性的信息, 这个提交有一个定义的例子。