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