Spring Web/Boot是否存在已映射标准HTTP状态码的内置异常?
当然有啦!Spring Web(包括Spring Boot)本身就内置了一堆已经和标准HTTP状态码绑定好的异常类——你根本不用自己写映射逻辑,直接抛出这些异常,框架就会自动帮你返回对应的HTTP状态码。我给你整理了几个日常开发里最常用的:
HttpMessageNotReadableException:对应 400 Bad Request
通常在请求体格式错误(比如JSON语法错误)时会自动抛出,你也可以手动抛出它来表示请求参数或格式不符合要求。HttpRequestMethodNotSupportedException:对应 405 Method Not Allowed
当客户端用了接口不支持的请求方法时会自动触发(比如用POST请求一个只开放GET的接口),也能手动抛出它来明确提示请求方法不合法。MissingServletRequestParameterException:对应 400 Bad Request
当必填的请求参数缺失时会自动抛出,手动抛出它可以清晰告知用户某个必填参数没传。ResourceNotFoundException:对应 404 Not Found
Spring Boot 2.3版本之后新增的异常,专门用来表示请求的资源不存在,直接抛这个比自己定义404异常要方便得多。AccessDeniedException:对应 403 Forbidden
用来表示用户没有权限访问目标资源,Spring Security场景下也会自动抛出这个异常。HttpMediaTypeNotSupportedException:对应 415 Unsupported Media Type
当客户端发送的请求Content-Type是服务器不支持的类型时抛出(比如接口只接受JSON,但客户端发了multipart/form-data)。MethodArgumentNotValidException:对应 400 Bad Request
当你用@Valid或@Validated校验请求参数(比如DTO字段)失败时,框架会自动抛出这个异常,里面还包含了详细的校验失败信息。
另外要提一句:这些异常的映射逻辑是Spring通过ResponseEntityExceptionHandler(Spring Boot默认启用的)或者DefaultHandlerExceptionResolver自动处理的。如果需要自定义错误响应的格式,你可以继承ResponseEntityExceptionHandler重写对应的处理方法,或者用@RestControllerAdvice结合@ExceptionHandler来扩展,但如果只是需要标准的HTTP状态码,直接抛这些内置异常就完全够用了。
内容的提问来源于stack exchange,提问作者Adam Siemion

