跳到主要内容

@SetValue 注解 - 扁平 Bean 与嵌套 JSON 双向映射


作用

@SetValue 标记 Bean 字段的目标路径,配合 ConvertUtil.convert() 实现扁平 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 = ConvertUtil.convert(user, JSONMap.class);
// → {"name":"张三","info":{"phone":"13800138000"}}

// 嵌套 JSON → Bean
User result = ConvertUtil.convert(json, User.class);
// user.phone = "13800138000"

多层嵌套

@SetValue 值支持点号分隔的深层路径:

@Data
public class Config {
@SetValue("level1.level2.level3")
private String deepValue;
}

// convert → {"level1":{"level2":{"level3":"value"}}}

convert 行为(Bean → Map)

  • 读取字段上的 @SetValue 注解值(如 "info"
  • 构建路径 annotationValue + "." + fieldName(如 "info.phone"
  • 调用 target.set(path, value) 写入嵌套结构

convert 行为(Map → Bean)

  • 读取字段上的 @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;
}
// 返回给前端时 ConvertUtil.convert(dto, JSONMap.class) 自动嵌套