@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) 自动嵌套