Hibernate 无法执行删除时返回的正确http状态代码是什么?

Hibernate 无法执行删除时返回的正确http状态代码是什么?,hibernate,http,Hibernate,Http,我的应用程序接受http DELETE请求,该请求将从通过hibernate管理的数据库中删除条目 删除某些条目会产生hibernate.ConstraintViolationException,因为它们是另一个表中的键,因此不被接受。但是,根据数据库的状态,此错误可能会随时间发生变化 对于这种情况,正确的http响应是什么 我想到412(前提条件失败),因为系统没有满足条目未被使用的前提条件。这听起来很像客户机在错误发生时没有权力纠正错误。仅此一点就有资格获得身份代码: 状态代码的5xx(服务

我的应用程序接受http DELETE请求,该请求将从通过hibernate管理的数据库中删除条目

删除某些条目会产生hibernate.ConstraintViolationException,因为它们是另一个表中的键,因此不被接受。但是,根据数据库的状态,此错误可能会随时间发生变化

对于这种情况,正确的http响应是什么


我想到412(前提条件失败),因为系统没有满足条目未被使用的前提条件。

这听起来很像客户机在错误发生时没有权力纠正错误。仅此一点就有资格获得身份代码:

状态代码的5xx(服务器错误)类表示服务器意识到自己出错或无法执行请求的方法。[…]这些响应代码适用于任何请求方法

确切地说,我认为这是合乎规程的。该代码主要用于指示维护,但实际上是指示服务器端的一个临时状态,该状态阻止了请求的实现。这也符合我的要求

如果您对此感到不舒服,请按推荐顺序列出一些备选方案:


但是,如果客户机有机会纠正此错误(例如,首先发出另一个请求),则5xx类是不可能的,您应该从代码424开始。如果您关注的是WebDAV引入的代码,请不要担心:它在HTTP中是有效的。

< P>您考虑了409吗?“409(冲突)状态代码表示由于与目标资源的当前状态发生冲突而无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。服务器应生成一个有效负载,其中包含足够的信息,以供用户识别请求的来源e冲突。”——

您可能需要重新阅读。此状态代码不足以解决您的问题。@DaSourcerer,我将其解释为前提条件:=“该项未在其他表中使用”。我想有更合适的状态可以返回,这就是为什么我发布了这个问题。。那么在这种情况下,合适的状态是什么呢?不,前提是引用
If-*
类型的头。更准确地说:这是客户端发出的有条件请求失败的先决条件。@DaSourcerer对,那么我的应用程序应该返回什么?对于未来:。我发现自己经常使用它;)424我以前没注意到这个。它确实是这样的:首先请求其他操作,例如删除其他实体。这不是真正的服务器端错误。Thank.424不适用:“424(失败的依赖项)状态代码表示无法在资源上执行该方法,因为请求的操作依赖于另一个操作,并且该操作失败。例如,如果PROPPATCH方法中的一个命令失败,则至少其他命令也会因424(失败的依赖项)而失败。”这很有说服力:我准备接受424,但现在409听起来也非常合理。客户端需要解决冲突,即删除引用原始条目的第二个条目,以便能够请求第一次删除。我发现所有这些都相当令人困惑:“(失败的)依赖关系”和“冲突”之间有什么区别?是的,我相信409和429都适用于我最初问题中描述的场景。在我的实际案例中,我认为409是正确的,服务器应该通知客户端需要哪些其他步骤(例如删除)来安全地执行原始删除。假设服务器支持对任何引用元素进行递归删除,但发生了错误(例如,有一个受保护的元素),我想429是正确的,如果不是5xx.Hm,也很有趣。看来我对状态代码409和424的理解存在严重缺陷。