mapstruct defaultvalue mapstruct的用法
本文将介绍如何使用 MapStruct 处理 Java 中包含递归结构的数据序列化,例如树形结构。我们以一个 Tree 类包含其 Leaf 类为例,演示如何使用 MapStruct 将其转换对应的 TreeResponse 和 LeafResponse
首先,我们来看一下需要转换的实体类和目标响应类:@Builder@Getter@AllArgsConstructor@FieldDefaults(level = PUBLIC)public class Tree { String name; Listlt;Leafgt; leafs;}@Builder@Getter@AllArgsConstructor@FieldDefaults(level = PUBLIC)public class Leaf { String name; Listlt;Leafgt; childs;}@Getter@Setter@FieldDefaults(level = PUBLIC)public class TreeResponse { String name; Listlt;LeafResponsegt; leafs;}@Getter@Setter@FieldDefaults(level = PUBLIC)public class LeafResponse { String name; Listlt;LeafResponsegt;children;}登录后复制
可以看到,Leaf类包含一个children列表,该列表也是Leaf类型的,这就构成了一个层次结构。
为了使用MapStruct进行转换,需要定义两个Mapper接口:TreeMapper和LeafMapperSecond。
立即学习“Java免费学习笔记(深入)”;@Mapperpublic interface TreeMapper { @Mapping(target) = quot;namequot;, source = quot;entity.namequot;) TreeResponse map(TreeEntity);}@Mapperpublic interface LeafMapperSecond { LeafResponse map(Leafentity);Listlt;LeafResponsegt;map(Listlt;Leafgt;entity);}登录后复制
TreeMapper负责将Tree对象为TreeResponse对象。LeafMapperSecond负责将Leaf对象转换为LeafResponse对象,并且提供了一个用于将 List 转换为 List 的方法。
关键点定义了两个 Mapper接口,并且在LeafMapperSecond中定义了列表转换方法。MapStruct会自动处理列表的电位转换,不需要手动编写复杂的电位逻辑。
现在,我们可以编写一个测试用例来验证转换是否正确:private TreeMapper treeMapper = Mappers.getMapper(TreeMapper.class);private LeafMapperSecond leafMapper = Mappers.getMapper(LeafMapperSecond.class);@Testpublic void test() { Listlt;Leafgt; leafs = new ArrayListlt;gt;(); leafs.add(Leaf.builder().name(quot;Leaf 1quot;).build()); leafs.add( Leaf.builder() .name(quot;Leaf 2quot;) .children( Arrays.asList( Leaf.builder() .name(quot;Leaf Children 1quot;) .children( Arrays.asList( Leaf.builder() .name(quot;Leaf Children) 1.1quot;) .build(), Leaf.builder() .name(quot;Leaf Children 1.2quot;) .build())) .build(), Leaf.builder().name(quot;叶子节点2quot;).build())) .build());
Tree tree = Tree.builder().name(“树名”;).leafs(leafs).build(); TreeResponse treeResponse = treeMapper.map(tree);assertEquals(treeResponse.name,“树名”;);assertEquals(treeResponse.leafs.size(), 2);LeafResponse leafWithChildren = treeResponse.leafs.stream() .filter(l -gt; l.name.equals(quot;Leaf 2quot;)) .findFirst() .orElse(null);assertNotNull(leafWithChildren);assertEquals(leafWithChildren.getChildren().size(), 2);LeafResponse leafWithSubChildren = leafWithChildren.children.stream().filter(l -gt;l.name.equals(quot;Leaf Children) 1quot;)) .findFirst() .orElse(null);assertNotNull(leafWithSubChildren);assertEquals(leafWithChildren.getChildren().size(), 2);}登录后复制
在这个测试示例中,我们创建了一个包含Leaf对象的Tree对象,然后使用TreeMapper其为TreeResponse对象。最后,我们断言后的TreeResponse对象中的是否数据与预期一致。
注意事项:确保MapStruct的依赖已正确添加到项目中。使用@Mapper注解标记Mapper接口。对于稀疏结构,需要定义多个Mapper接口,并提供转换列表转换方法。MapStruct会自动处理List的稀疏逻辑,需要手动编写复杂的稀疏逻辑。如果需要自定义映射逻辑,可以使用@Mapping注解。
总结:
通过使用MapStruct,我们可以轻松地处理包含递归结构的数据序列化。这种高效简单、,而且容易。它避免了手动编写复杂的逻辑逻辑,提高了开发效率。这种方法特别适用于API开发,将复杂的内部数据结构可以转换为格式的JSON响应。
以上就是使用MapStruct处理Java层次结构的序列化的详细内容,更多请关注乐哥常识网其他相关!