通用配置应该从当前项目的接口约定出发,不能把其他项目的错误码、路由和登录方式整套复制进来。下面列出容易混淆的几处,并给出一个能直接检查的 HTTP 错误响应。
HTTP 状态与业务错误
Spring MVC 的 @RestControllerAdvice 负责控制器异常处理,它不是 Spring AOP 切面。下面用于 Java 17 以上 / Spring Boot 3,保存到启动类扫描范围:
package example;
import org.springframework.http.HttpStatus;import org.springframework.http.ProblemDetail;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvicepublic class CommonErrors { @ExceptionHandler(IllegalArgumentException.class) public ProblemDetail invalidInput(IllegalArgumentException failure) { return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "请求参数不符合要求"); }}测试控制器:
package example;
import java.util.Map;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class CommonDemoController { @GetMapping("/api/demo/count") public Map<String, Integer> count(@RequestParam int limit) { if (limit < 1 || limit > 100) throw new IllegalArgumentException(); return Map.of("limit", limit); }}添加 Web starter 后启动现有项目,执行 curl.exe -i 'http://127.0.0.1:8080/api/demo/count?limit=101',应返回 400,而不是 200 加“失败”。正常 limit=10 返回 JSON。若项目已有异常处理规范,按原规范接入,不再同时增加第二套包装类。
前端请求与跨域
Axios 对非 2xx HTTP 响应进入错误分支,业务 code 还要按项目约定检查。跨站 Cookie 请求可能需要 withCredentials,默认同源 Cookie 请求不因此要求开启;Cookie 的 SameSite、Secure 和服务端策略也会影响发送。
允许携带凭据的跨域配置应只允许明确的可信来源。例如本机调试的 http://localhost:5173,不能用 allowedOriginPatterns("*") 向任意来源开放账号数据。CORS 控制浏览器跨域读取,不替代登录、权限和 CSRF 防护。
未登录可以跳转登录页,但不要自动重放删除、支付等写请求。redirect 参数由服务端限制为站内路径,避免成为任意跳转入口。
分页与生成代码
分页限制页码和每页上限;排序字段使用后端白名单,不能将任意 sortField 拼入 SQL。认证身份由服务端上下文取得,而不是直接信任请求体。
OpenAPI 生成的客户端需要和实际响应及请求封装一致。类型错误先查 schema、生成器版本和导入路径,不能通过跳过检查把“能运行”当作类型正确;skipLibCheck 也不会消除所有业务源码错误。
依赖优先由 Spring Boot BOM 管理,确有消费者再添加。配置处理、日志和接口文档不要混成一套无关业务脚手架。
评论