跳到主要内容

@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) 写入嵌套结构
  • 第二个参数 onlySetValuetrue 时只复制带 @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) 自动嵌套

← 上一节:工具类速查表 | 返回文档导航 | 下一节:多维数组支持 →