响应处理 
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