禁用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
将使内联表示呈现为你想要它。
这个提交通常有更多关于这个特性的信息, 这个提交有一个定义的例子。