使用Spring @ResponseStatus设置HTTP状态码

2023/05/19

1. 简介

在Spring MVC中,我们有很多方法来设置 HTTP 响应的状态码。

在这个简短的教程中,我们将看到最直接的方法:使用@ResponseStatus注解。

2. 关于控制器方法

当端点成功返回时,Spring 提供 HTTP 200 (OK) 响应。

如果我们想指定控制器方法的响应状态,我们可以用@ResponseStatus 标记该方法。对于所需的响应状态,它有两个可互换的参数:代码和值。例如,我们可以指示服务器拒绝冲泡咖啡,因为它是茶壶

@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}

当我们想要发出错误信号时,我们可以通过reason参数提供错误消息:

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}

请注意,当我们设置reason时,Spring 调用HttpServletResponse.sendError()。因此,它会向客户端发送一个 HTML 错误页面,这使得它不适合 REST 端点。

另请注意,当标记的方法成功完成(不抛出Exception)时,Spring 仅使用@ResponseStatus 。

3.使用错误处理程序

我们有三种方法可以使用@ResponseStatus将异常转换为 HTTP 响应状态:

  • 使用@ExceptionHandler
  • 使用@ControllerAdvice
  • 标记异常类

为了使用前两个解决方案,我们必须定义一个错误处理程序方法。你可以在本文中阅读有关此主题的更多信息。

我们可以将@ResponseStatus与这些错误处理程序方法一起使用,就像我们在上一节中使用常规 MVC 方法一样。

当我们不需要动态错误响应时,最直接的解决方案是第三种:用@ResponseStatus 标记 Exception 类:

@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}

当 Spring 捕获此Exception时,它会使用我们在@ResponseStatus中提供的设置。

请注意,当我们用@ResponseStatus标记异常类时,无论我们是否设置原因,Spring 总是调用HttpServletResponse.sendError()。

另请注意,Spring 对子类使用相同的配置,除非我们也用@ResponseStatus标记它们。

4. 总结

在本文中,我们看到了如何使用@ResponseStatus在不同的场景中设置 HTTP 响应代码,包括错误处理。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章