2995840376
4d8d38909d
fix(I): HTTP 语义类异常返回真实 4xx 状态码, 不再兜底成 500
问题:GlobalExceptionHandler 只对业务异常/参数校验做了分类,其余异常一律被兜底的
Exception handler 处理成 500「系统繁忙」。例如以 application/octet-stream 发送
JSON 请求体本应返回 415 Unsupported Media Type,却得到 500,误导调用方与排障。
改动(iot-common,四个服务共用):
- ResultCode 新增:UNSUPPORTED_MEDIA_TYPE(415) / NOT_ACCEPTABLE(406) / PAYLOAD_TOO_LARGE(413)
- GlobalExceptionHandler 新增 HTTP 语义类异常处理:
HttpMediaTypeNotSupportedException -> 415
HttpMediaTypeNotAcceptableException -> 406
HttpRequestMethodNotSupportedException-> 405
MissingServletRequestParameterException / MethodArgumentTypeMismatchException
/ HttpMessageNotReadableException -> 400
MaxUploadSizeExceededException -> 413
- 响应约定:真实 HTTP 状态码 + body.code 与状态码保持一致(沿用 JwtAuthenticationEntryPoint 的
401 约定);业务/参数异常维持 HTTP 200 + body.code 的历史约定,前端无需改动
- 这类异常属客户端错误,日志级别由 error 降为 warn,避免污染错误日志
- 新增单测 iot-common/src/test/java/com/iot/common/exception/GlobalExceptionHandlerHttpStatusTest.java
(2 个用例全部通过)
生产验证:
错误 Content-Type -> HTTP 415 body.code=415
错误请求方法 -> HTTP 405
参数类型不匹配 -> HTTP 400
请求体 JSON 非法 -> HTTP 400
正常列表/物模型 -> HTTP 200
前端 axios 拦截器对非 401/403/500 的 4xx 走 data?.message 分支,提示更准确,无回归。
2026-10-27 19:31:56 +08:00
..
2026-10-27 19:31:56 +08:00
2026-10-27 12:00:41 +08:00