响应处理
cnadmin 对响应处理进行了统一封装,包括:统一响应数据结构、统一异常处理等,旨在简化开发流程并提升API的一致性和可维护性。
配置说明
本项目依赖 ContiNew Starter continew-starter-web
,其提供了 Spring Web 轻量扩展优化,详情请查阅 starter 对应文档。该模块主要提供以下功能:
- 跨域支持:通过配置文件快速启用和定制跨域过滤器(CorsFilter)
- 统一响应处理:基于 Graceful Response 实现响应数据封装、异常处理和错误码管理
- Query 参数转换器:Date、LocalDate、LocalTime、LocalDateTime、BaseEnum 类型参数自动转换
- 服务器优化:默认使用 Undertow 替代 Tomcat,提供更优性能;支持全局禁用不安全 HTTP 请求方法
统一响应数据结构
我们采用 Graceful Response 进行统一的响应数据封装,接口只需直接返回数据即可被自动封装为标准响应结构。这有助于保持 API 响应格式的一致性,并简化前端数据处理逻辑。
使用示例
以下是一个简单的控制器示例,展示了如何返回数据:
@GetMapping("/{id}")
public UserDetailResp get(@PathVariable Long id) {
// 直接返回业务数据,框架会自动封装为统一响应结构
return userService.get(id);
}
返回的 JSON 结构如下:
{
"code": "0", // 响应码:0表示成功
"msg": "ok", // 响应消息
"success": true, // 是否成功
"timestamp": 1755240981618, // 时间戳
"data": { // 业务数据
...
}
}
排除响应封装
如果你不需要封装响应结构(例如:下载数据接口),可以添加 @ExcludeFromGracefulResponse
注解来排除:
@ExcludeFromGracefulResponse
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile() {
// 直接返回文件资源,不进行响应封装
Resource resource = new ClassPathResource("example.pdf");
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=example.pdf")
.body(resource);
}
自定义响应配置
Graceful Response 提供了灵活的自定义响应配置。下方为 cnadmin 默认的全局响应配置,你可根据需要自行调整:
--- ### 全局响应配置
continew-starter.web.response:
# 自定义失败 HTTP 状态码(默认:200,建议业务和通信状态码区分)
default-http-status-code-on-error: 200
# 自定义成功响应码(默认:0)
default-success-code: 0
# 自定义成功提示(默认:ok)
default-success-msg: ok
# 自定义失败响应码(默认:1)
default-error-code: 1
# 自定义失败提示(默认:error)
default-error-msg: error
# 是否将原生异常错误信息填充到状态信息中
origin-exception-using-detail-message: false
# 响应类全名(配置后 response-style 将不再生效)
response-class-full-name: top.continew.starter.web.model.R
提示:我们已在
continew-starter-web
中默认提供了top.continew.starter.web.model.R
响应结构并封装部分常用方法。如果无法满足需求或需要自定义结构,请参考该类进行定制。
统一异常处理
cnadmin 采用 Graceful Response 结合自定义异常处理器的方式进行统一异常拦截处理,确保 API 错误响应的一致性和友好性。异常处理代码位于 continew-common
模块的 config/exception
包下,你可以根据需要自行增加或删减异常处理。
全局异常处理器
GlobalExceptionHandler(全局异常处理器) 处理以下异常类型:
异常类型 | 描述 |
---|---|
BaseException | 自定义异常 |
BusinessException | 业务异常 |
BadRequestException | 自定义验证异常-错误请求 |
MissingServletRequestParameterException | 方法参数缺失异常,例如:@RequestParam 参数缺失 |
BindException、MethodArgumentNotValidException | 参数校验不通过异常,例如:@NotBlank 等 |
MethodArgumentTypeMismatchException | 方法参数类型不匹配异常,例如:@RequestParam 参数类型不匹配 |
HttpMessageNotReadableException | HTTP 消息不可读异常 例如: 1.@RequestBody 缺失请求体 2.@RequestBody 实体内参数类型不匹配 3.请求体解析格式异常 |
MultipartException | 文件上传异常-超过上传大小限制 |
NoHandlerFoundException | 请求 URL 不存在异常 |
HttpRequestMethodNotSupportedException | 不支持的 HTTP 请求方法异常 |
SaToken 异常处理器
GlobalSaTokenExceptionHandler(全局 SaToken 异常处理器) 处理以下认证和授权异常:
异常类型 | 描述 |
---|---|
NotLoginException | 未登录或登录过期异常 |
NotPermissionException | 权限不足异常 |
NotRoleException | 角色不匹配异常 |
参考资料
- Graceful Response 项目主页:https://doc.feiniaojin.com/graceful-response/home.html
- ContiNew Starter Web 文档:https://continew.top/starter/module/web.html