Spring REST-资源不存在时正确的PUT功能

问题描述 投票:0回答:1

我正在使用Spring构建REST API并实现PUT功能。我正在尝试处理客户端尝试将PUT放入资源不存在的uri的情况。在这种情况下,根据PUT规范,应在该ID处创建一个新资源。但是,由于我正在使用ID生成策略(@GeneratedValue(strategy = GenerationType.IDENTITY)),因此无法创建ID顺序不正确的资源。数据库必须使用下一个可用值。但是,根据PUT的w3规范...

如果Request-URI没有指向现有资源,并且请求用户代理可以将该URI定义为新资源,则源服务器可以使用该URI创建资源。

如果服务器希望将请求应用于其他URI,则它必须发送301(永久移动)响应;然后,用户代理可以自行决定是否重定向请求。

在这种情况下,我都不能做。由于ID生成的限制,我无法在现有URI上创建新资源,并且我无法发送301移动永久响应,因为根据How do I know the id before saving an object in jpa,在实际持久存储对象之前无法知道序列中的下一个ID。因此,我无法告诉客户端要正确创建新资源重定向到的URI。

我想这个问题已经解决了很多遍,因为它是标准的PUT功能,但是我很难找到其他尝试这样做的人。似乎大多数人只是忽略PUT的“创建新资源”部分,而仅将其用作更新。

我想做的就是继续创建新资源,然后发送301永久移动以将客户端重定向到所创建资源的真实位置-但正如我们在上面看到的,这违反了PUT的定义。

是否有解决此问题的方法?还是问题没有解决,true标准做法是完全不允许通过PUT创建新资源?

java spring rest spring-mvc put
1个回答
1
投票

400错误的请求-由于明显的客户端错误(例如,格式不正确的请求语法,大小太大,无效的请求消息框架或欺骗性的请求路由),服务器无法或不会处理请求。

© www.soinside.com 2019 - 2024. All rights reserved.