@ResponseStatus
是 Spring 框架中的一个注解,用于自定义 HTTP 响应状态码和原因描述。它可以用在类或方法上,指定当方法成功执行或抛出异常时返回的 HTTP 状态码。
作用
- 自定义 HTTP 状态码:指定方法成功执行时返回的 HTTP 状态码。
- 异常处理:指定当方法抛出特定异常时返回的 HTTP 状态码和原因描述。
- 简化异常处理:通过
@ResponseStatus
,可以避免编写额外的异常处理代码。
使用场景
- 自定义成功响应:例如,当某个资源创建成功时,返回
201 Created
状态码。 - 异常处理:例如,当资源未找到时,返回
404 Not Found
状态码。 - 统一响应格式:通过结合
@ControllerAdvice
和@ExceptionHandler
,可以实现全局异常处理和统一的响应格式。
使用方法
@ResponseStatus
可以用在以下两种场景:
- 方法级别:指定方法成功执行时返回的 HTTP 状态码。
- 异常级别:指定当方法抛出特定异常时返回的 HTTP 状态码和原因描述。
1. 方法级别
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
public class MyController {
@PostMapping("/create")
@ResponseStatus(HttpStatus.CREATED) // 成功创建资源时返回 201 Created
public String createResource() {
return "Resource created";
}
}
在这个例子中:
- 当
createResource
方法成功执行时,Spring 会返回 HTTP 状态码201 Created
。
2. 异常级别
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource not found") // 当抛出 ResourceNotFoundException 时返回 404 Not Found
public class ResourceNotFoundException extends RuntimeException {
// 自定义异常类
}
@RestController
public class MyController {
@GetMapping("/resource/{id}")
public String getResource(@PathVariable String id) {
if (!"123".equals(id)) {
throw new ResourceNotFoundException(); // 抛出异常
}
return "Resource found";
}
}
在这个例子中:
- 当
getResource
方法抛出ResourceNotFoundException
时,Spring 会返回 HTTP 状态码404 Not Found
和原因描述"Resource not found"
。
常用属性
value
:指定 HTTP 状态码(例如HttpStatus.NOT_FOUND
)。code
:与value
相同,用于指定 HTTP 状态码(Spring 5 引入)。reason
:指定返回的原因描述(可选)。
注意事项
- 优先级:如果方法中显式设置了 HTTP 状态码(例如通过
HttpServletResponse
),@ResponseStatus
的设置会被覆盖。 - 全局异常处理:在全局异常处理中(使用
@ControllerAdvice
和@ExceptionHandler
),@ResponseStatus
的设置会被全局处理器的设置覆盖。 - 原因描述:
reason
属性仅适用于简单的文本描述,如果需要返回复杂的响应体(如 JSON),建议使用ResponseEntity
。
与 ResponseEntity
的区别
@ResponseStatus
:用于简单场景,直接指定 HTTP 状态码和原因描述。ResponseEntity
:用于复杂场景,可以自定义 HTTP 状态码、响应头和响应体。
示例:使用 ResponseEntity
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
public class MyController {
@GetMapping("/resource/{id}")
public ResponseEntity<String> getResource(@PathVariable String id) {
if (!"123".equals(id)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found");
}
return ResponseEntity.ok("Resource found");
}
}
在这个例子中:
- 使用
ResponseEntity
可以更灵活地控制响应状态码和响应体。
总结
@ResponseStatus
用于自定义 HTTP 响应状态码和原因描述,适用于方法成功执行或异常处理的场景。- 它简化了 HTTP 状态码的管理,但适用于简单场景。对于复杂场景,建议使用
ResponseEntity
。 - 通过结合
@ControllerAdvice
和@ExceptionHandler
,可以实现全局异常处理和统一的响应格式。
合理使用 @ResponseStatus
可以提高代码的可读性和可维护性,同时提供清晰的 HTTP 响应语义。
THE END
暂无评论内容