@SetValue 注解 - 扁平 Bean 与嵌套 JSON 双向映射
作用
@SetValue 标记 Bean 字段的目标路径,配合 BeanUtil.copyAsSource() / copyAsTarget() 实现扁平 Bean 与嵌套 JSON 的双向映射。
基本用法
@Data
public class User {
private String name;
@SetValue("info")
private String phone;
@SetValue("info")
private String address;
}
// Bean → 嵌套 JSON
User user = new User();
user.setName("张三");
user.setPhone("13800138000");
JSONMap json = new JSONMap();
BeanUtil.copyAsSource(user, json, false);
// → {"name":"张三","info":{"phone":"13800138000"}}
// 嵌套 JSON → Bean
BeanUtil.copyAsTarget(json, user);
// user.phone = "13800138000"
多层嵌套
@SetValue 值支持点号分隔的深层路径:
@Data
public class Config {
@SetValue("level1.level2.level3")
private String deepValue;
}
// copyAsSource → {"level1":{"level2":{"level3":"value"}}}
copyAsSource 行为
- 读取字段上的
@SetValue注解值(如"info") - 构建路径
annotationValue + "." + fieldName(如"info.phone") - 调用
target.set(path, value)写入嵌套结构 - 第二个参数
onlySetValue:true时只复制带@SetValue的字段
copyAsTarget 行为
- 读取字段上的
@SetValue注解值 - 构建源路径
annotationValue + "." + fieldName - 从源 Map 中按路径取值,写入 Bean 字段
应用场景
数据库 JSON 字段映射
@Data
@TableName("user")
public class User {
private Long id;
private String name;
@SetValue("ext_info")
private String phone; // 存入 ext_info.phone
@SetValue("ext_info")
private String address; // 存入 ext_info.address
}
// DB: {"id":1,"name":"张三","ext_info":{"phone":"138xxx","address":"北京"}}
前后端结构适配
@Data
public class OrderDTO {
private Long orderId;
private BigDecimal amount;
@SetValue("buyer")
private String buyerName;
@SetValue("shipping")
private String address;
}
// 返回给前端时 copyAsSource(dto, response, false) 自动嵌套