在日常开发过程中,Spring中默认的HTTP状态处理并不能满足所以场景,可以使用
ResponseStatusExceptionResolver
机制通过抛出异常的方式来相应对应的HTTP状态码。
常用HTTP状态码分类和HttpStatus枚举的对应关系
- 1XX 信息状态码:接受的请求正在处理
- 2XX 成功状态码:请求正常处理完毕
- 200 -
HttpStatus.OK
(请求成功) - 204 -
HttpStatus.NO_CONTENT
(无内容) - 206 -
HttpStatus.PARTIAL_CONTENT
(部分内容)
- 200 -
- 3XX 重定向状态码:需要进行附加操作以完成请求
- 301 -
HttpStatus.MOVED_PERMANENTLY
(永久移动) - 302 -
HttpStatus.Found
(临时移动) - 303 -
HttpStatus.SEE_OTHER
(查看其他地址) - 304 -
HttpStatus.NOT_MODIFIED
(未修改) - 307 -
HttpStatus.TEMPORARY_REDIRECT
(临时重定向)
- 301 -
- 4XX 客户端错误状态码:服务器无法处理请求
- 400 -
HttpStatus.BAD_REQUEST
(错误请求) - 401 -
HttpStatus.UNAUTHORIZED
(未经授权) - 403 -
HttpStatus.FORBIDDEN
(拒绝请求) - 404 -
HttpStatus.NOT_FOUND
(无法找到)
- 400 -
- 5XX 服务端错误状态码:服务器处理请求出错
- 500 -
HttpStatus.INTERNAL_SERVER_ERROR
(内部服务器错误) - 503 -
HttpStatus.SERVICE_UNAVAILABLE
(服务不可用)
- 500 -
利用
ResponseStatusExceptionResolver
进行注解的方式并将其映射到HTTP状态代码可以在接口中抛出相关异常达到抛出指定异常的目的。
错误请求处理过程
以错误请求400为例,其他场景处理方式类似
定义ResourceBadRequestException类
注意要添加@ResponseStatus
注解,和相应的HttpStatus
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class ResourceBadRequestException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
在监测到相应的问题时抛出对应的异常
@Controller
public class MyController {
@RequestMapping("/delEms")
public String delEms(String emsId){
if(StringUtils.isNotBlank(emsId)){
// 调用JPA删除,并获取返回值是否大于0
int delNum = jpa.deleteByEmsId(emsId);
if (selNum > 0){
// 正常返回处理相关的数据
}
}
throw new ResourceBadRequestException(EMS ID 未找到)
}
}