使用 Spring @ResponseStatus 设置 HTTP 状态码

x33g5p2x  于2022-09-25 转载在 Spring  
字(1.8k)|赞(0)|评价(0)|浏览(817)

介绍

在 Spring 中,我们可以通过多种方式设置 HTTPResponse 的状态。在本教程中,我们将使用 Spring ResponseStatus 注解来实现这一点。

我们可以使用@ResponseStatus 注解来标记方法或异常类,并带有状态码和返回原因。在调用标记的处理程序方法或抛出指定的异常时,HTTP 状态将设置为使用 @ResponseStatus 注解定义的状态。

使用控制器方法

当该方法在 Spring 中成功执行时,Spring 提供了 HTTP 状态码 200(OK)响应。

如果我们想从我们的一个控制器方法返回另一种类型的 HttpStatus 怎么办?

如果我们想指定控制器方法的响应状态,我们需要使用 @ResponseStatus 注解对该方法进行注解。对于所需的响应类型,它有两个可互换的参数:代码和值。

例如 :

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    @PostMapping(value = "/employee")
    @ResponseStatus(HttpStatus.CREATED)
    public Employee createEmployee(@RequestBody Employee employee)
    {
        return  employeeRepository.save(employee);
    }
}

我们也可以指定响应状态的原因。如果我们想用原因发出错误消息或成功消息,那么我们可以如下使用它。 (使用原因值实现相同的代码)

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @Autowired
    private EmployeeRepository employeeRepository;

    @PostMapping(value = "/employee")
    @ResponseStatus(value = HttpStatus.CREATED, reason = "Employee Created")
    public Employee createEmployee(@RequestBody Employee employee)
    {
        return  employeeRepository.save(employee);
    }
}

请注意,当我们设置 reason 时,Spring 会调用 HttpServletResponse.sendError()。因此,它会向客户端发送一个HTML 错误页面,这使得它不适合 REST 端点
另请注意,Spring 仅在 标记的方法成功完成时使用 @ResponseStatus(不抛出 Exception)。

或者,我们可以使用 @ReponseStatus 注解来注解 Controller 类。在这种情况下,配置的 ResponseStatus 将应用于所有请求处理程序方法。

带有错误处理程序

我们可以将 @ResponseStatus 注解与错误处理程序一起使用,就像我们用于 Controller 方法一样。

@ControllerAdvice
public class CustomExceptionHandler extends RuntimeException{

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NullPointerException.class)
    public void handleException(String message)
    {
        System.out.println(message);
    }
}

当 Spring 捕获到这个异常时,它使用了 @ResponseBody 中提供的配置。

请注意,当我们用 @ResponseStatus 标记 Exception 类时,无论我们是否设置 reason,Spring 总是调用 HttpServletResponse.sendError()**,

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

代码示例在 Github

相关文章

微信公众号

最新文章

更多