mapstruct 对象转换,属性为null

本文详细描述了一项目中遇到的MapStruct对象映射时,属性默认为null的问题。通过复现步骤、分析原因(涉及Lombok与MapStruct冲突),并提供解决方案,包括调整编译顺序以确保属性赋值。适合开发者理解和处理此类转换问题。
摘要由CSDN通过智能技术生成

mapstruct 对象转换,属性为null

问题

描述

项目中同时使用了mapstruct ,在最终生成的jar反编译中发现,impl里仅new了一个对象,并未对属性赋值,最终结果为null。

复现

转换
在这里插入图片描述
生成,可以看到最终生成的实现里仅new了一个GetSchoolVO,并没有赋值。
在这里插入图片描述
请求接口中可以看到有一条数据,但是属性全部为null
在这里插入图片描述

分析

多次测试后,发现如果clear target后,生成属性全部为null,若不clear,直接删除添加红框代码后,可以对属性赋值,由此可以感知为编译时产生的问题。
在这里插入图片描述
看到了另一篇博客提到了lombok,再次查看自己的pom文件,发现在build的时候,lombok与MapStruct问题,调整后解决。
改之前
在这里插入图片描述
正确顺序
在这里插入图片描述
实测解决

测试

实现,成功赋值
在这里插入图片描述

接口
在这里插入图片描述

如果你想在将一个 `List` 转换成另一个 `List` 的过程中,只针对其中的某个对象进行转换,可以使用 MapStruct 提供的 `@IterableMapping` 注解。 举个例子,假设我们有两个类 `Source` 和 `Target`: ```java public class Source { private String name; private int age; // getter/setter } public class Target { private String fullName; private int yearsOld; // getter/setter } ``` 现在我们有一个 `List<Source>`,我们只想将其中 `name` 属性为 "Tom" 的对象转换成 `Target` 对象,我们可以定义一个映射方法: ```java @Mapper public interface SourceTargetMapper { @Mapping(source = "name", target = "fullName") @Mapping(source = "age", target = "yearsOld") Target sourceToTarget(Source source); @IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT) List<Target> sourceListToTargetList(List<Source> sourceList, @ElementTargetType Class<? extends Target> targetType); } ``` 在上面的代码中,我们使用 `@Mapping` 注解来指定将 `Source` 的 `name` 属性映射到 `Target` 的 `fullName` 属性,将 `Source` 的 `age` 属性映射到 `Target` 的 `yearsOld` 属性。然后我们定义了一个 `sourceListToTargetList` 方法,该方法使用 `@IterableMapping` 注解来标记这是一个 `List` 类型的映射方法,并且使用 `@ElementTargetType` 注解来指定要转换成的目标类型。在方法内部,我们使用 `stream()` 方法遍历 `List`,然后只对 `name` 属性为 "Tom" 的对象进行转换。 需要注意的是,我们需要将 `@IterableMapping` 注解的 `nullValueMappingStrategy` 属性设置为 `NullValueMappingStrategy.RETURN_DEFAULT`,否则在转换过程中,如果某个对象不符合转换条件,会将其转换成 `null`,从而导致 `NullPointerException`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值