面试题:Spring 中的 @ResponseStatus 注解的作用是什么?

@ResponseStatus 是 Spring 框架中的一个注解,用于自定义 HTTP 响应状态码和原因描述。它可以用在类或方法上,指定当方法成功执行或抛出异常时返回的 HTTP 状态码。


作用

  1. 自定义 HTTP 状态码:指定方法成功执行时返回的 HTTP 状态码。
  2. 异常处理:指定当方法抛出特定异常时返回的 HTTP 状态码和原因描述。
  3. 简化异常处理:通过 @ResponseStatus,可以避免编写额外的异常处理代码。

使用场景

  • 自定义成功响应:例如,当某个资源创建成功时,返回 201 Created 状态码。
  • 异常处理:例如,当资源未找到时,返回 404 Not Found 状态码。
  • 统一响应格式:通过结合 @ControllerAdvice@ExceptionHandler,可以实现全局异常处理和统一的响应格式。

使用方法

@ResponseStatus 可以用在以下两种场景:

  1. 方法级别:指定方法成功执行时返回的 HTTP 状态码。
  2. 异常级别:指定当方法抛出特定异常时返回的 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:指定返回的原因描述(可选)。

注意事项

  1. 优先级:如果方法中显式设置了 HTTP 状态码(例如通过 HttpServletResponse),@ResponseStatus 的设置会被覆盖。
  2. 全局异常处理:在全局异常处理中(使用 @ControllerAdvice@ExceptionHandler),@ResponseStatus 的设置会被全局处理器的设置覆盖。
  3. 原因描述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
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容