【问题标题】:HttpStatus code in case of update operation but no row gets updated更新操作但没有更新行时的 HttpStatus 代码
【发布时间】:2021-08-31 20:16:39
【问题描述】:

我试图通过(java.sql.PreparedStatement.executeUpdate()) 调用存储过程来通过@PutMapping (org.springframework.web.bind.annotation.PutMapping) 更新数据库中的资源。这一步工作得很好,我得到了低于 DB 的整数响应:

  1. 1 - 1 行已更新
  2. 0 - 没有更新行

我想根据从数据库返回的整数将响应发送回用户,因为我从其余控制器返回 ResponseEntity<UpdateResponseVO>,其中 UpdateResponseVO 是普通的 POJO 类:

public class UpdateResponseVO {

    private String responseCode;

    private String message;

}

我根据以下条件构建 ResponseEntity:

UpdateResponseVO apiResponse = new UpdateResponseVO();
if (row > 0) {
 apiResponse.setResponseCode("200");
 apiResponse.setMessage("Updated Successfully.");
 return new ResponseEntity<UpdateResponseVO>(apiResponse, HttpStatus.OK);
}
else {
 apiResponse.setResponseCode(???);
 apiResponse.setMessage("No row updated.");
 return new ResponseEntity<UpdateResponseVO>(apiResponse, ???);
}

现在我的问题是当 0 行被更新时我的响应代码应该是什么(当我们不知道数据库中要更新的当前值并且我们给出相同的值时,就会出现这种情况。例如,在 DB 中已经是学生名称是“abc”,我们想再次将其更新为“abc”。因此更新的行将是 0) 以及我应该与 ResponseEntity 一起发送的 HttpStatus。

【问题讨论】:

标签: java spring-boot http-status-codes spring-restcontroller


【解决方案1】:

我不确定您在接收错误数据时在哪里处理异常,推荐使用 @Validated 并验证您在控制器主体中接收的请求 DTO 的方法。使用@ControllerAdvice 全局处理异常。
现在,具体来说,您应该返回 HttpStatus.FORBIDDEN 即 403,因为这是数据验证错误。在您的情况下,您检查 row==0 是否简单,一般来说,如果有任何处理错误,然后以 500 回复。我个人更喜欢在成功/错误情况下使用 HttpStatus.OK 的通用响应,并使用 ResponseEntity&lt;?&gt; 在哪里可以返回任何对象作为响应。

【讨论】:

  • 我使用 ControllerAdvice 仅在一个地方处理异常。但是这里没有发生错误。当我们不知道数据库中要更新的当前值并且我们给出相同的值时,就会出现这种情况。例如,在 DB 中,学生姓名已经是“abc”,我们想再次将其更新为“abc”。因此更新的行将是 0。在这种情况下应该返回什么响应代码?
  • 如果您将此情况归类为异常,则取决于您的应用程序,然后从您的服务方法中您可以抛出一个自定义(使用相同数量更新的行数检测)异常,在这种情况下您应该返回 403,如果您没有将其归类为异常,那么您可以简单地返回 HttpStatus 200 和 apiResponse.setResponseCode("403"); 以便客户端应用程序可以采取行动。
  • 哪里是 DTO 哪里是问题中的错误控制器建议如何解决问题?它主要是幂等请求,所有后续调用都相同,存储过程返回 0,问题想知道在这种情况下应该是什么值。
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 2014-07-22
  • 2014-05-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多