Skip to main content
 首页 » 编程设计

spring Controller中返回自定义状态码

2022年07月19日268JustinYoung

spring Controller中返回自定义状态码

本文我们讨论几种方式从spring mvc conroller中返回自定义的Http状态码。为了更清楚地给客户端描述请求结果,使用丰富的HTTP协议语言比较重要。例如,当发生请求错误时,针对不同的错误类型发送一个特定的错误代码,客户端根据错误消息展示相应的错误消息。

返回自定义状态码

spring 提供多种方式从Controller类中返回自定义状态码:
* 使用ResponseEntity类
* 在异常类上使用@ResponseStatus注解
* 使用@ControllerAdvice 和 @ExceptionHandler 注解

这几种方式并不是相互排斥,相反它们可以相互补充。本文我们介绍前两种方式 (ResponseEntity 和 @ResponseStatus)。后续继续说明其他方式。

通过ResponseEntity类返回状态码

在标准的spring mvc Controller中,我们定义简单的映射:

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

一旦收到get 请求 “/controller” ,spring将返回406响应(不可接受)。这里随意选择了一个特定的响应码,你能返回HTTP状态码,完整的状态码参考文档

通过异常类返回状态码

这里描述第二种方法通过异常类返回状态码:

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

当收到get 请求 “/exception”,spring 将抛出ForbiddenException类异常,定义为独立类并增加相应注解:

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

异常类中无需其他相关代码,仅需要@ResponseStatus注解。当抛出异常时,控制器返回403响应码(FORBIDDEN),如果必要,在注解中增加相应消息。

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

需要特别说明的是技术上可以返回任意状态码,但错误的状态码可能引起逻辑上误解。一般使用(4XX 和 5XX)。

总结

本文描述如何从spring mvc Controller中返回自定义状态码。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/82049921