java中设计rfc 7807错误响应应使用spring boot 3.x的problemdetail类,通过type、title、status、detail、instance字段及setproperty添加扩展属性,配合@controlleradvice统一异常处理,无需额外依赖或手动拼json。

Java 中设计符合 RFC 7807 标准的错误响应体,核心是使用 Spring Boot 3.x 内置的 ProblemDetail 类,并围绕其字段语义组织业务错误信息。不需要引入额外依赖,也不必手动拼 JSON——Spring 已深度集成该规范。
用 ProblemDetail 替代 Map 或自定义 ErrorDTO
避免返回类似 {"code":400,"msg":"参数错误"} 这类非标结构。直接构造 ProblemDetail 实例,它会自动序列化为 RFC 7807 要求的 JSON 格式,且响应头 Content-Type 自动设为 application/problem+json。
-
type 必填:建议用公司域名 + 错误路径,如
"https://api.example.com/errors/invalid-otp",指向内部文档页 -
title 必填:一句话说明错误类型,如
"验证码不合法",前端可直接展示 -
status 推荐显式设置:传入
HttpStatus.BAD_REQUEST等,Spring 会同步写入响应状态码 -
detail 建议填写:解释具体原因,如
"OTP 已过期或格式错误" -
instance 可选但推荐:填当前请求路径,如
"/auth/verify",便于日志关联
在 Controller 中直接返回 ProblemDetail
适用于明确知道错误场景、无需全局拦截的简单逻辑,比如参数校验失败后立即返回。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 方法返回类型声明为
ProblemDetail或ResponseEntity<problemdetail></problemdetail> - 调用
ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "OTP 已失效") - 再通过
withType(URI.create("..."))、withTitle("验证码已过期")链式设置其余字段 - Spring 会自动将 status 字段与 HTTP 状态码对齐,无需重复设置响应头
用 @ControllerAdvice 统一处理异常
这是生产环境推荐方式,把各类业务异常(如 InsufficientBalanceException)映射为结构化 ProblemDetail。
- 创建一个类并标注
@ControllerAdvice - 为每种异常写一个
@ExceptionHandler方法,返回ResponseEntity<problemdetail></problemdetail> - 在方法体内 new 一个
ProblemDetail,填入对应 type/title/status/detail - 支持添加扩展字段:调用
setProperty("balance", 25.0)或setProperty("retry_after", 60),不会破坏标准结构
扩展字段要加在 ProblemDetail 上,不是另建子类
Spring 的 ProblemDetail 支持动态属性,比继承更轻量、更安全。
- 直接调用
problemDetail.setProperty("errorCode", "BALANCE_INSUFFICIENT") - 或
problemDetail.setProperty("suggested_action", "请先充值") - 这些字段会随标准字段一起输出,客户端可按需读取,不影响兼容性
- 避免为了加字段就新建继承类——除非你有强类型约束需求(如 Swagger 文档生成)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










