Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析

目录

  1. RESTful API 设计规范
  2. Spring MVC 核心注解解析
  3. 静态资源处理策略
  4. JSON 数据交互全解
  5. 高频问题与最佳实践

一、RESTful API 设计规范

1.1 核心原则

原则 说明 示例 URI
资源为中心 URI 使用名词(复数形式) /users ✔️ /getUser ❌
HTTP 方法语义化 GET(查)、POST(增)、PUT(改)、DELETE(删) DELETE /users/1
无状态通信 服务端不保存客户端会话状态 每次请求携带完整认证信息

1.2 完整代码示例

java 复制代码
@RestController
@RequestMapping("/api/v1/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return user != null ? 
            ResponseEntity.ok(user) : 
            ResponseEntity.notFound().build();
    }

    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userService.save(user);
        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}").buildAndExpand(savedUser.getId());
        return ResponseEntity.created(location).body(savedUser);
    }
}

1.3 高级技巧

  • HATEOAS 实现(响应中嵌入资源链接):
java 复制代码
@GetMapping("/{id}/orders")
public CollectionModel<Order> getUserOrders(@PathVariable Long id) {
    List<Order> orders = orderService.findByUserId(id);
    Link selfLink = linkTo(methodOn(UserController.class).getUserOrders(id)).withSelfRel();
    return CollectionModel.of(orders, selfLink);
}
  • 响应示例:
json 复制代码
{
  "content": [ ... ],
  "_links": {
    "self": { "href": "/users/1/orders" }
  }
}

二、Spring MVC 核心注解解析

2.1 参数绑定注解

注解 作用场景 示例代码
@PathVariable 从 URI 路径提取变量 @GetMapping("/{id}") → id=1
@RequestParam 绑定查询参数(支持默认值) @RequestParam(name="page", defaultValue="1")
@RequestBody 将请求体 JSON 映射到 Java 对象 public User createUser(@RequestBody User user)

2.2 元数据获取注解

java 复制代码
// 获取 Cookie 值
@GetMapping("/session")
public String getSession(@CookieValue("JSESSIONID") String sessionId) { ... }

// 读取请求头
@GetMapping("/headers")
public String getHeader(@RequestHeader("User-Agent") String userAgent) { ... }

2.3 作用域注解

注解 作用域 生命周期
@SessionAttribute 读取 Session 属性 用户会话期间有效
@ModelAttribute 预加载模型数据 每次请求前执行

三、静态资源处理策略

3.1 配置方式对比

方式 配置示例 适用场景
缺省 Servlet 放行 web.xml 配置 <servlet-mapping> 传统项目兼容
resources 标签 <mvc:resources mapping="/img/**" location="/img/"/> 明确指定资源目录
default-servlet-handler <mvc:default-servlet-handler/> 快速放行所有静态资源

3.2 常见问题

  • JSP 未被放行:需通过视图解析器处理,不属于静态资源。
  • 路径冲突 :避免控制器映射与静态资源路径重叠(如 /js/** 与 /js/controller)。

四、JSON 数据交互全解

4.1 响应 JSON 配置

java 复制代码
@RestController // = @Controller + @ResponseBody
public class ApiController {

    @GetMapping("/city/{id}")
    public City getCity(@PathVariable int id) {
        return cityService.findById(id);
    }
}

4.2 序列化控制

java 复制代码
@Data
public class Product {
    @JsonIgnore
    private String internalCode; // 不序列化

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;     // 日期格式化
}

4.3 依赖配置

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.0</version>
</dependency>

五、高频问题与最佳实践

5.1 常见错误

  1. RESTful 路径设计混乱
    • ❌ /getUserOrders?userId=1 → ✅ GET /users/1/orders
  2. HTTP 方法误用
    • ❌ 用 POST 请求更新资源 → ✅ 使用 PUT/PATCH
  3. JSON 日期序列化错误
    • 解决方案:@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

5.2 性能优化

  • 静态资源缓存 :配置 Cache-Control 头减少重复请求。
  • Jackson 延迟加载 :对大数据集使用 @JsonView 控制序列化字段。
相关推荐
m0_5873830038 分钟前
工业场景设备维修维护实战技巧 全流程标准化落地与常见问题排查指南
java·spring·小程序·架构·需求分析
木头科技1 小时前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
我是人✓2 小时前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring
ab1237683 小时前
Spring Integration 完整笔记 + 和 spring-integration-mqtt、Paho、EMQX 的关系
java·笔记·spring
HelloWorld工程师3 小时前
@Primary 注解
java·spring
代码什么用13 小时前
Spring基础使用
java·后端·spring
代码什么用13 小时前
Spring对IoC的实现
数据库·spring
Su米苏14 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
java资料站16 小时前
二、Spring AI Alibaba · ChatModel
java·windows·spring
java资料站17 小时前
五、Spring AI Alibaba · Memory · Saver(短期会话)
java·spring·microsoft