我用SpringBoot写接口,总结了三个实用技巧

发布时间:2026/9/7 1:17:27
我用SpringBoot写接口,总结了三个实用技巧
写了几年Spring Boot接口见过太多“能跑就行”的代码——Controller里塞满业务逻辑、异常堆栈直接甩给前端、参数校验散落各处。接口能通测试能过演示很干净。然后生产流量一来API风格乱成一锅粥日志看了等于没看没人敢改。本文不聊那些“忘了加RestController”的新手错误直击三个真正影响开发效率和接口质量的实用技巧。技巧一Controller只做一件事——把HTTP请求翻译成业务调用Controller里写业务逻辑是最常见也最致命的问题。一个看似人畜无害的PostMapping做着HTTP处理、库存校验、实体创建、状态判断、持久化、响应映射。六个月后它涨到500行所有人都不敢碰它——怕改坏了。Controller只该做一件事把HTTP请求翻译成应用行为然后把结果翻译回HTTP。瘦身后的Controller只剩依赖注入和一行调用java复制下载RestController RequestMapping(/api/v1/orders) public class OrderController { private final OrderService orderService; PostMapping ResponseStatus(HttpStatus.CREATED) public OrderResponse create(Valid RequestBody OrderRequest request) { return orderService.createOrder(request); } }业务逻辑去Service层用Transactional统一管理事务。差别看着小生产环境里是天壤之别。瘦Controller好测、好改、好理解。如果你的Controller里有业务规则、有数据库操作、有外部调用——它已经不是Controller了是个穿了HTTP外套的胖Service。另一个常见的坑是直接把Entity当API返回。JPA Entity是持久化模型API响应是对外契约这俩不是一回事。直接返回EntitypasswordHash和内部标记可能就泄露了。更坑的是懒加载——序列化时触发额外查询或者直接报LazyInitializationException。永远用DTO作为接口的入参和出参绝不暴露Entity。技巧二全局异常处理 参数校验让接口“体面”地出错接口不可能不出错关键是出错时给前端一个统一、清晰的反馈。最推荐的方式是用RestControllerAdvice做全局异常处理。定义一个统一响应结构包含状态码、消息、数据然后用ExceptionHandler分别处理不同类型的异常——自定义业务异常、参数校验异常、运行时异常。不要直接把Exception堆栈返回给前端。参数校验同样值得认真对待。用Valid配合JSR-303注解NotBlank、Min、NotNull等把校验逻辑写在DTO上而不是在Controller里写满if-else。校验失败时会抛出MethodArgumentNotValidException由全局异常处理器统一捕获并返回友好的错误信息。更进一步可以设计分层异常处理业务异常、系统异常和校验异常分开处理既保证通用性又为特定场景提供精细化处理。响应体中包含timestamp和traceId便于问题追踪。状态码与HTTP状态分离——status存HTTP状态码如400、500code存业务错误码如VALIDATION_FAILED前端可以根据不同错误码做差异化处理。技巧三用拦截器统一处理横切关注点登录验证、请求日志、权限校验、防重复提交——这些功能如果写在每个Controller里代码冗余且难以维护。Spring Boot的拦截器HandlerInterceptor机制让这些横切关注点可以统一处理。实现一个拦截器重写三个方法preHandle请求进入Controller之前执行、postHandleController执行完成后、afterCompletion整个请求完成后。然后注册到Spring MVC配置中指定拦截路径和排除路径。最实用的两个场景请求日志记录。在preHandle中记录请求URL、IP、参数和开始时间在afterCompletion中计算耗时并打印完整日志。这样每个接口的请求响应情况一目了然排查问题时再也不用靠猜。登录鉴权。在preHandle中校验请求头里的Token无效则直接返回401并中断请求。把鉴权逻辑从Controller中抽离出来让业务方法保持干净。拦截器比Filter更精确——可以精准到Controller方法级别且支持Spring依赖注入。用好拦截器能让你的接口代码清爽一大截。这三个技巧的本质是同一件事职责分离。Controller只管接收和响应业务逻辑归Service横切关注点归拦截器和全局处理器参数校验归DTO。各归其位各司其职。接口写得好不好不在于用了多新的技术而在于每一行代码是否待在该待的地方。代码的整洁度往往在第一次“能跑”之后才真正开始考验人的功力。