带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(4)https://developer.aliyun.com/article/1339760?groupCode=taobaotech
多个字段转换为一个字段
常用于将多个字段转为JSON字段,在以下示例中,为了避免引入第三方包(如FastJson),仅使用字符串拼接两 个字段,Json方式同理。
@Mapper public abstract class Converter { public static Converter INSTANT = Mappers.getMapper(Converter.class); @Mapping(target = "extra", source = "vo", qualifiedByName = "convertToExtra") public abstract DTO convert(VO vo); @Named("convertToExtra") public String convertToExtra(VO vo) { return String.format("%s,%s", vo.getAge(), vo.getUserNick()); } )
将多个字段转换为一个字段,需要以下几个步骤:
- 创建自定义转换方法(本例为convertToExtra()):
方法入参类型为被转换的类(本例为VO),出参为转换好的字段(本例为extra);
为方法加上@Named注解,并自定义该方法在mapStruct中的名字(本例中为convertToExtra)。
- 在转换方法上增加Mapping注解,其中: source字段必须与转换方法入参名字相同(本例中均为vo); target 字 段 为 目 标 字 段 ( 本 例 中 为 extra); qualifiedByName字段为上述自定义的方法名字。
将一个字段转换为多个字段
该方法常用于从JSON字段中取出数据。
原理与上述方法类似,定义两个自定义转换方法,用于转换extra字段。
@Mapper public abstract class Converter { public static Converter INSTANT = Mappers.getMapper(Converter.class); @Mapping(target = "age", source = "extra", qualifiedByName = "extractAge") @Mapping(target = "userNick", source = "extra", qualifiedByName = "extractUserNick") public abstract VO convertToVO(DTO dto); @Named("extractAge") public Long extractAge(String extra) { // 从extra中提取第一个值 return Long.valueOf(extra.split(",")[0]); } @Named("extractUserNick") public String extractUserNick(String extra) { // 从extra中提取第二个值return extra.split(",")[1]; }
使用示例
final VO vo = VO.builder() .id(1L) .age(18L) .userNick("Nick") .build(); // 转为DTO final DTO dto = Converter.INSTANT.convertToDTO(vo); System.out.println(dto); // 转回VO final VO newVo = Converter.INSTANT.convertToVO(dto); System.out.println(newVo);
输出:
1 DTO(id=1, extra=18,Nick) 2 VO(id=1, age=18, userNick=18)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(6)https://developer.aliyun.com/article/1339758?groupCode=taobaotech