我正在使用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创建新资源?
400错误的请求-由于明显的客户端错误(例如,格式不正确的请求语法,大小太大,无效的请求消息框架或欺骗性的请求路由),服务器无法或不会处理请求。