(可选)在Spring Data Rest中禁用HATEOAS格式

Ben*_*n M 16 rest hateoas spring-data hypermedia spring-data-rest

所以假设我有一个现有的应用程序有两个端点/人和/裤子.呼叫GET /人员返回:

[
    {
        "name":"john",
        "age":37,
        "pants":[
            {
                "color":"green",
                "brand":"levis",
                "size":"medium"
            },
            {
                "color":"indigo",
                "brand":"jncos",
                "size":"medium-with-huge-legs"
            }
        ]
    },
    {
        "name":"june",
        "age":23,
        "pants":[
            {
                "color":"pink",
                "brand":"gap",
                "size":"small"
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

如果我使用Spring Data Rest并拨打GET/person,我会收到类似的信息:

{
    "_links":{
        "next":{
            "href":"http://myapp.com/people?page=1&size=20"
        },
        "self":{
            "href":"http://myapp.com/people{&page,size,sort}",
            "templated":true
        },
        "search":{
            "href":"http://myapp.com/people/search"
        }
    },
    "_embedded":{
        "people":[
            {
                "name":"john",
                "age":37,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/john"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/john/pants"
                    }
                }
            },
            {
                "name":"june",
                "age":23,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/june"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/june/pants"
                    }
                }
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我有一堆我不想改变的现有客户端 - 在某些情况下是否有任何方法可以禁用响应的超媒体部分(比如Accept ="application/json")但是为了启用它们其他人(Accept ="hal + json")?

谢谢!

更新

好的 - 所以看起来我很懊恼,我不想支持.我说明为什么SDR强烈倾向于超媒体...但我不会购买提供基于标题"禁用"超媒体的功能,因此提供更多选项是一件坏事.

除此之外,我有点不确定如何通过我自己的控制器实现这一点.如果我创建一个Controller并尝试/people使用`produce ="application/json" 覆盖RequestMapping,我可以使用Accept ="application/json"返回"raw"json但是如果我通过Accept ="application/hal + json"我得到了406"找不到可接受的代表".看起来SDR资源映射没有映射到内容类型......任何建议?

gyo*_*der 18

简短的回答是,你不能在没有hateoas的情况下使用spring-data-rest.如果你想在没有hateoas的情况下构建你的web服务,你必须编写自己的控制器(它仍然可以使用spring-data存储库).

这篇SO帖子中引用Oliver Gierke :

实际上我的重点是:服务器正在做正常的REST.如果这打破了客户端,则需要修复(调整)客户端.因此,超媒体方面是Spring Data REST的基本方面,我们不会退缩.这可能不满足你的具体情况,但至少应该回答这个问题:). - 奥利弗吉尔克

  • 我很惊讶你不能覆盖序列化器/消息转换器只是不输出链接...似乎应该是可能的 (15认同)
  • 我接受了这个答案,但7年后,我仍然从根本上不同意Drotbohm对HATEOAS的坚持。我认为时间不断向我们表明,实际上,很少有消费者真正感兴趣或能够利用这些功能。 (9认同)
  • 7年后,我同意你的观点。:) (5认同)