Spring Controller 状态码

1. 概述

本文将演示从Spring MVC控制器返回自定义HTTP状态代码的几种方法。

状态码使用HTTP协议的完整丰富语义向客户端表达请求的结果并,状态码在响应的头部,会更快的传递给客户端,以便客户端能更快速地做出响应。例如,如果请求出现问题,则为每种可能的问题发送特定的错误代码将允许客户端向用户显示适当的错误消息。

2. 返回自定义状态代码

Spring提供了一些从Controller类返回自定义状态代码的主要方法:

  • 使用ResponseEntity
  • 在异常类上使用@ResponseStatus注释,以及
  • 使用@ControllerAdvice@ExceptionHandler注释。

这些选择不是相互排斥,实际上可以相互补充。

2.1 通过ResponseEntity返回状态代码

在标准的Spring MVC控制器中,我们将定义一个简单的映射:

1
2
3
4
5
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}

在收到对 “/ controller “的GET请求后,Spring将返回一个包含406 Code(Not Acceptable)的响应。我们任意选择了此示例的特定响应代码。您可以返回任何HTTP状态代码(可在此处找到完整列表)。

2.2 通过异常返回状态代码

我们将向控制器添加第二个方法,以演示如何使用Exception返回状态代码:

1
2
3
4
5
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
throw new ForbiddenException();
}

收到对” / exception “ 的GET请求后,Spring将抛出ForbiddenException,然后在在单独的类中定义的自定义异常处理:

1
2
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}

所有工作都由@ResponseStatus注释完成。

在这种情况下,当抛出异常时,抛出异常的控制器返回响应代码403(禁止)的响应。如有必要,您还可以在注释中添加将与响应一起返回的消息。

在这种情况下,该类将如下所示:

1
2
esponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}

注意,尽管在技术上可以使异常返回任何状态代码,但在大多数情况下,仅使用错误代码的异常(4XX和5XX)才具有逻辑意义。