当前位置: 首页 > news >正文

Spring Boot 实现 POJO 级联封装复杂属性

目录

一、项目结构

二、代码实现

1. User.java

2. UserController.java

三、请求测试

控制台输出:

返回结果(JSON 响应):

四、总结


在 Web 开发中,我们经常会遇到前端提交的数据比较复杂,不仅包含简单属性(如用户名、密码),还包含数组、对象等嵌套结构。这时候就需要在 POJO 类中实现级联封装,让 Spring Boot 能自动帮我们映射参数。

本文通过一个简单示例:User 对象中包含基本属性、数组属性和对象属性,来演示如何实现复杂参数的封装。


一、项目结构

src└── main└── java└── org.gdcp├── pojo│    └── User.java└── controller└── UserController.java

二、代码实现

1. User.java

文件路径:org/gdcp/pojo/User.java

package org.gdcp.pojo;import lombok.Data;@Data
public class User {private String username;   // 用户名private String password;   // 密码private String[] likes;    // 爱好(数组)private Info info;         // 复杂属性:包含省市区信息
}@Data
class Info {private String shen;   // 省private String shi;    // 市private String qu;     // 区
}

这里我们定义了 User 实体类,其中包含:

  • 基本属性usernamepassword

  • 数组属性likes

  • 对象属性info

这样前端在传参时,Spring Boot 就可以自动将复杂参数映射到 User 对象。


2. UserController.java

文件路径:org/gdcp/controller/UserController.java

package org.gdcp.controller;import org.gdcp.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@GetMapping("/login")public User add(User user){// 控制台打印对象System.out.println(user);// 返回给前端return user;}
}

这里我们提供了一个 /login 接口,接收 User 对象作为参数。Spring Boot 会根据请求参数自动封装成 User 实例。


三、请求测试

假设我们通过浏览器或 Postman 访问以下 URL:

http://localhost:8080/login?username=tom&password=123456&likes=java&likes=python&info.shen=广东&info.shi=广州&info.qu=天河

控制台输出:

User(username=tom, password=123456, likes=[java, python], info=Info(shen=广东, shi=广州, qu=天河))

返回结果(JSON 响应):

{"username": "tom","password": "123456","likes": ["java", "python"],"info": {"shen": "广东","shi": "广州","qu": "天河"}
}

四、总结

  • Spring Boot 中,请求参数名对象属性名 一致时,Spring 会自动封装。

  • 数组参数:直接用多值参数 likes=java&likes=python 即可。

  • 对象属性:使用 对象名.属性名 的形式,例如 info.shen=广东

  • 使用 @RestController + @GetMapping 就能快速实现接口测试。

通过这种方式,我们就能轻松实现 POJO 级联封装复杂属性,简化了参数接收和数据处理逻辑。

http://www.dtcms.com/a/347514.html

相关文章:

  • Redis学习笔记 ----- 缓存
  • 寻鲜之旅“咖”约深圳,容声冰箱引领“养鲜”新体验
  • 解决coze api使用coze.workflows.runs.create运行workflow返回400,但text为空
  • ⚡ Ranger 基础命令与功能详解
  • Talkie AI
  • 硬件笔记(27)---- 恒流源电路原理
  • 环境 (shell) 变量
  • QT-Mysql-查询语句-查询是否有表-表列名-查询记录
  • 力扣hot100:搜索二维矩阵与在排序数组中查找元素的第一个和最后一个位置(74,34)
  • ros 消息类型与查阅相关内容
  • XCVM1802-2MSEVSVA2197 XilinxAMD Versal Premium FPGA
  • 同步和异步、阻塞和非阻塞的再理解
  • JAVA核心基础篇-集合
  • 力扣(组合)
  • 如何解决 pyqt5 程序“长时间运行失效” 问题?
  • React学习(十一)
  • Windows 平台查看端口占用情况并终止进程
  • flink常见问题之非法配置异常
  • leetcode 852 山脉数组的顶峰索引
  • 讲点芯片验证中的统计覆盖率
  • 【URP】[平面阴影]原理与实现
  • 如何使用和优化SQL Server存储过程:全面指南
  • 论文阅读:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges
  • 【数据分享】地级市对外开放程度(2002-2021)-有缺失值
  • SpringBoot自动装配原理深度解析
  • 【LeetCode 热题 100】300. 最长递增子序列——(解法一)记忆化搜索
  • mmap映射物理内存之四内核cache同步
  • 后台管理系统-14-vue3之tag标签页的实现
  • JEI(Journal of Electronic lmaging)SCI四区期刊
  • TypeScript的接口 (Interfaces)讲解