如何使用 HttpStatus 消息?
例如,我有这个控制器,我做的是 send HttpStatus.OK
,那是为了成功,但如果它失败了,我该怎么办?
@PostMapping("/createMeet")
public ResponseEntity<Meet> createMeet(@RequestParam("user") Long idUser,@RequestBody Meet meet ) {
return new ResponseEntity<Meet>(meetService.createMeet(idUser, meet), HttpStatus.OK);
}
Spring 提供了一种机制,通过可以在类中使用的标记来管理异常
@ControllerAdvice
,将其用作 http 拦截器,以便您定义的每个异常都转到该类,并且您可以修改您决定在异常情况下发送的响应以及“HTTP 状态码”。我们将看到整个过程,第一件事是有一个带有我们端点的控制器:这个类就是控制器,为了简化代码我们没有添加服务注入来定义对应URI的getCoffee方法:
重要的是控制器没有任何类型的逻辑,因为这不是它的功能,它的功能是将服务器接收到的HTTP请求重定向到负责执行必要逻辑的相应服务,包括异常管理。按照我们的例子:
为简单起见,我们从服务中删除了数据访问逻辑,但请记住职责分离(调用存储库来获取数据)。现在,回到最初的问题,我需要能够在出现错误的情况下发送响应,因为我当前的代码默认情况下只会发送 200OK 或 500INTERNAL_SERVER_ERROR 以防我的代码失败。为此,Spring 为您提供了 @ControllerAdvicer 标签,您可以使用它做几件事,让我们看一个非常简单的示例,我们创建我们的异常处理程序:
当抛出异常时,在每个 HTTP 请求中都会调用此异常处理程序,并搜索是否存在使用该异常激活的方法(在 中定义的方法
@ExceptionHandler
),在我们的示例中,我们将 Exception 基本上对应于我们的任何错误应用程序,如果我们想修改任何异常的一般错误响应,这将很有用,我们可以修改错误消息,状态代码,定义与通用错误json不同的错误json......该层负责处理异常控制器,仅此而已。但是在我们的例子中,我们可能想要添加一个新的异常来对应不同的 http 代码,例如,在我们的例子中,我们可以请求一个具有数据库中不存在的 id 的咖啡,并返回一个带有代码的错误响应404NOT_FOUND 。为此,我们必须在我们的服务中抛出一个特定的异常(总是在一个负责我们应用程序逻辑的服务中)。在我们的例子中,作为“未找到”,我们可以创建一个异常 EntityNotFoundException():
好吧,现在我们有了自定义异常(数据库中没有咖啡时可以抛出的异常),我们必须将此异常映射到 HTTP 404 响应,为此我们将相应的方法添加到异常处理程序中我们之前创建过:
现在我们的 http 请求有两个可能的错误响应,我们之前定义的通用 500 或我们在第二种方法中定义的 404。为了让我们的服务器发送这个 404,我们只需要在我们认为有必要时在我们的服务中抛出 EntityNotFoundException,例如:
有了这个,我们就会有完整的流程,充分尊重职责分离。请注意,在抛出异常时,您可以将消息作为参数发送,该参数将添加到异常处理程序的日志中,您可以使用它向异常处理程序发送您可能需要管理错误的信息。
在必须响应其他状态(400、404、500 等)的情况下,您必须在控制器中处理异常,请记住状态 200 表示一切都按预期进行。
但是这些错误是从哪里来的呢?好吧,它们将根据为您的应用程序开发提出的逻辑,由您自己在您的应用程序的 BO (@Service) 中定义。
这里有一个例子:
服务
您可以看到,如果在数据库中找不到任何联系人,我将如何返回一个特定的异常(由我为我的特定情况制作),该异常将缓存在控制器中并以 404 NOT FOUND 状态处理。
控制器