Spring Boot 使用@ResponseBody时如何设置HttpStatus代码?

mznpcxlj  于 2022-12-04  发布在  Spring
关注(0)|答案(2)|浏览(184)

在SpringBoot控制器类中,我的API通常返回一个带有主体和状态代码的ResponseEntity,但我显然可以通过用@ResponseBody注解我的控制器方法来省去ResponseEntity,如下所示:

@Controller
public class DemoController 
{
  @Autowired
  StudentService studentService;

  @GetMapping("/student")
  @ResponseBody
  Student getStudent(@RequestParam id) {
    return studentService.getStudent(id);
  }
}

如果我的服务抛出了一个异常,我可以通过抛出一个ResponseStatusException来返回一个自定义的HTTP状态,但是不清楚如何指定一个有效响应的HTTP状态。我该如何指定它?或者它如何决定使用什么?

w8ntj3qf

w8ntj3qf1#

如果您使用@ResponseBody注解,控制器方法的传回型别会当做回应主体使用。如果控制器方法成功完成,HTTP状态码会预设为200(OK),如果掷回例外状况,则预设为500(Internal Server Error)。
您可以掷回具有所需状态码的ResponseStatusException,以指定自订HTTP状态码。例如:

@Controller
public class DemoController 
{
  @Autowired
  StudentService studentService;

  @GetMapping("/student")
  @ResponseBody
  Student getStudent(@RequestParam id) {
    if (id == null) {
      throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Missing required parameter 'id'");
    }
    return studentService.getStudent(id);
  }
}
wpx232ag

wpx232ag2#

处理它的更好方法可能是您的自定义ExceptionHandler:

@Controller
public class DemoController {
    @Autowired
    StudentService studentService;

    @GetMapping("/student")
    @ResponseStatus(HttpStatus.OK)
    Student getStudent(@RequestParam id) {
        return studentService.getStudent(id);
    }

    @ExceptionHandler(StudentNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    ErrorResponse handleStudentNotFoundException(StudentNotFoundException ex) {
        return new ErrorResponse("Student not found with id: " + ex.getId());
    }
}

阅读更多信息:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

相关问题