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
..