【发布时间】:2020-05-07 23:35:07
【问题描述】:
我正在使用 Spring 构建一个 REST API 并实现 PUT 功能。我正在尝试处理客户端尝试 PUT 到资源尚不存在的 uri 的场景。在这种情况下,根据 PUT 规范,应在该 ID 处创建一个新资源。但是,由于我使用的 ID 生成策略 (@GeneratedValue(strategy = GenerationType.IDENTITY)),我无法创建 ID 乱序的资源。数据库必须使用下一个可用值。但是,根据 W3 规范 PUT...
如果 Request-URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。
如果服务器希望将请求应用于不同的 URI,它必须发送 301(永久移动)响应;然后,用户代理可以自行决定是否重定向请求。
在这种情况下,我不能做这两个。由于 ID 生成限制,我无法在现有 URI 上创建新资源,也无法发送 301 Moved Permanently 响应,因为根据How do I know the id before saving an object in jpa,在实际持久化对象之前不可能知道序列中的下一个 ID。所以我无法告诉客户端要重定向到哪个 URI 才能正确创建新资源。
我想这个问题已经解决了很多次,因为它是标准的 PUT 功能,但是我很难找到任何其他尝试这样做的人。似乎大多数人只是忽略了 PUT 的“创建新资源”部分,而只是将其用作更新。
我想要做的只是继续创建新资源,然后发送 301 Moved Permanently 将客户端重定向到创建资源的真实位置 - 但正如我们在上面看到的,这违反了 PUT 的定义.
有解决这个问题的弹簧方式吗?还是问题没有解决,true 标准做法是根本不允许通过 PUT 创建新资源?
【问题讨论】:
-
在这种情况下显示错误。
标签: java spring rest spring-mvc put