SpringBoot系列-对象值复制
背景
在实际开发中,我们往往会遇到这种情况:需要将一个对象的值复制到另外一个对象
如下就是使用·构造器赋值的方式
@Accessors(chain = true)
public class OmsOrder implements Serializable {
private static final long serialVersionUID = 829307454068003789L;
/**
* 订单id
*/
private Long id;
/**
* 会员id
*/
private Long memberId;
/**
* 优惠券id
*/
private Long couponId;
/**
* 订单编号
*/
private String orderSn;
/**
* 提交时间
*/
private Date createTime;
/**
* 用户帐号
*/
private String memberUsername;
//省略部分字段
}
@Data
@Accessors
public class AppOrderVo {
private Long orderId;
private String orderNo;
private Integer status;
private BigDecimal totalPrice;
private List<OmsOrderItem> orderItems;
public AppOrderVo(OmsOrder order, List<OmsOrderItem> items){
if(order!=null){
this.orderId = order.getId();
this.orderNo=order.getOrderSn();
this.status=order.getStatus();
this.totalPrice=order.getTotalAmount();
}
this.orderItems = items;
}
}
1.使用Spring或者Apache的BeanUtils.copyProperties对象赋值
OmsOrder order = new OmsOrder();
order.setMemberId(111111l);
order.setStatus(1);
order.setOrderSn("21319393");
order.setAutoConfirmDay(11);
order.setBillReceiverEmail("1392770104@163.com");
AppOrderVo vo = new AppOrderVo();
BeanUtils.copyProperties(order,vo);
return ResponseResult.success(vo);
结果:
2.使用mapstruct,以下版本为我自己尝试的,部分版本会有问题
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<!-- 解决lombok插件和 mapstruct 冲突导致 mapstruct 不可用 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
maven打包依赖版本:注意:使用maven:3.6以下,可能导致编译问题
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
<compilerArg>
-Amapstruct.unmappedTargetPolicy=WARN
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
定义中间类
@Mapper(componentModel="spring")
public interface OrderMap {
OrderMap INSTANCE = Mappers.getMapper(OrderMap.class);
/** @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性
* @return 返回的是目标对象,就是最终的结果对象
*/
@Mappings({
@Mapping(source = "id", target = "orderId"),
@Mapping(source = "orderSn", target = "orderNo")
})
AppOrderVo toAppVo(OmsOrder order);
}
使用方式:
OmsOrder order = new OmsOrder();
order.setMemberId(111111L);
order.setStatus(1);
order.setId(11111L);
order.setOrderSn("21319393");
order.setAutoConfirmDay(11);
order.setBillReceiverEmail("1392770104@163.com");
AppOrderVo vo = OrderMap.INSTANCE.toAppVo(order);
结果: