网站首页 > java教程 正文
在 MapStruct 生成对应的实现类的时候, 有如下的几个情景。
1 属性名称相同,则进行转化
在实现类的时候, 如果属性名称相同, 则会进行对应的转化。这个在之前的文章代码中已经有所体现。 通过此种方式, 我们可以快速的编写出转换的方法。
源对象类
目标对象类
转化类
由于 Source 和 Target 需要转化的属性是完全相同的。因此, 在 Mapper 中, source2target 方法很快就可以编写出来了。 只需要确定入参和返回值即可。
2 属性名不相同, 可通过 @Mapping 注解进行指定转化。
属性名不相同, 在需要进行互相转化的时候, 则我们可以通过 @Mapping 注解来进行转化。
在上面的 Source 类中, 增加一个属性 totalCount
而对应的 Target 中, 定义的属性是 count。
如果方法没做任何的改变, 那么,在转化的时候, 由于属性名称不相同, 会导致 count 属性没有值。
这时候, 可以通过 @Mappimg 的方式进行映射。
仅仅是在方法上面加了一行。再次允许测试程序。
3 Mapper 中使用自定义的转换
有时候, 对于某些类型, 无法通过代码生成器的形式来进行处理。 那么, 就需要自定义的方法来进行转换。 这时候, 我们可以在接口(同一个接口, 后续还有调用别的 Mapper 的方法)中定义默认方法(Java8及之后)。
在 Source 类中增加
对应的类
相应的, 在 Target 中
对应的类
然后在 SourceMapper 中添加方法及映射, 对应的方法更改后
进行测试
4 多转一
我们在实际的业务中少不了将多个对象转换成一个的场景。 MapStruct 当然也支持多转一的操作。
有 Address 和 Person 两个对象。
而在实际的使用时, 我们需要的是 DeliveryAddress 类
其对应的信息不仅仅来自一个类, 那么, 我们也可以通过配置来实现多到一的转换。
测试
在多对一转换时, 遵循以下几个原则
- 当多个对象中, 有其中一个为 null, 则会直接返回 null
- 如一对一转换一样, 属性通过名字来自动匹配。 因此, 名称和类型相同的不需要进行特殊处理
- 当多个原对象中,有相同名字的属性时,需要通过 @Mapping 注解来具体的指定, 以免出现歧义(不指定会报错)。 如上面的 description
属性也可以直接从传入的参数来赋值。
在上面的例子中, hn 直接赋值给 houseNumber。
5 更新 Bean 对象
有时候, 我们不是想返回一个新的 Bean 对象, 而是希望更新传入对象的一些属性。这个在实际的时候也会经常使用到。
在 AddressMapper 类中, 新增如下方法
注解 @MappingTarget后面跟的对象会被更新。 以上的代码可以通过以下的测试。
6 获取 mapper
6.1 通过 Mapper 工厂获取
在上面的例子中, 我们都是通过 Mappers.getMapper(xxx.class) 的方式来进行对应 Mapper 的获取。 此种方法为通过 Mapper 工厂获取。
如果是此种方法, 约定俗成的是在接口内定义一个接口本身的实例 INSTANCE, 以方便获取对应的实例。
这样在调用的时候, 我们就不需要在重复的去实例化对象了。类似下面
6.2 使用依赖注入
对于 Web 开发, 依赖注入应该很熟悉。 MapSturct 也支持使用依赖注入, 同时也推荐使用依赖注入。
值注入方式default默认的方式, 使用 Mappers.getMapper(Class) 来进行获取 MappercdiContexts and Dependency Injection. 使用此种方式, 需要使用 @Inject 来进行注入springSpring 的方式, 可以通过 @Autowired 来进行注入jsr330生成的 Mapper 中, 使用 @javax.inject.Named 和 @Singleton 注解, 通过 @Inject 来注入
6.3 依赖注入策略
可以选择是通过构造方法或者属性注入, 默认是属性注入。
类似如此使用
猜你喜欢
- 2024-10-03 SpringBoot中如何根据JSON数据生成一个动态对象?
- 2024-10-03 边玩手机边学Java----Java基础之Map
- 2024-10-03 Java Stream API:优雅地操作Map(java map stream filter)
- 2024-10-03 聊聊Mybatis的初始化之Mapper.xml映射文件的解析
- 2024-10-03 MapStruct 使用教程, 万字详解(mapstruct enum)
- 2024-10-03 看似简单,在JAVA中如何将一个Object转换成Array
- 2024-10-03 java8函数式Map操作也太强大了吧,1次就帮我省了10多行代码
- 2024-10-03 map的一个骚操作!你学废了么?#互联网
- 2024-10-03 轻松搞定!用JavaScript将列表转换为Map
- 2024-10-03 告别 BeanUtils,拥抱 MapStruct:高效 Java 对象映射的经典之选
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)