我想用BeanCopier来进行下面两个pojo的复制
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("t_order")
public class Order extends BaseEntity {
private static final long serialVersionUID=1L;
private Long userId;
private Integer amount;
private Long productId;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderDTO {
private Long userId;
private Integer amount;
private Long productId;
}
发现下面的操作会报错
public static void main(String[] args) {
Order order = Order.builder().productId(3333L).userId(9999L).amount(32).build();
OrderDTO orderDTO = new OrderDTO();
orderCopier.copy(order, orderDTO, null);
JSONUtils.toJSONString(orderDTO);
}
报错如下
java.lang.ClassCastException: com.k i.order.dto.OrderDTO cannot be cast to com.ki.order.entity.Order
at org.springframework.cglib.empty.Object$$BeanCopierByCGLIB$$2ae6b31f.copy(<generated>)
at com.ki.order.controller.OrderController.main(OrderController.java:50)
而如果是
orderCopier.copy(orderDTO, order, null);
不会报错,但是赋值不成功,order的字段为null
怎么回事?
你得先看看你这个
orderCopier
是怎么被create
出来的噻,BeanCopier.create
方法有三个参数这第一个参数代表源对象的
Class
,第二个参数代表目标对象的Class
,从你报错来看,明显你的orderCopier
对象被创建的时候,是写的create(OrderDTO.class, Order.class, false)
,所以你再调用copy
方法的时候,你第一个参数填order
,明显跟OrderDTO.class
不匹配,当然就报了ClassCastException
咯至于为什么写

orderCopier.copy(orderDTO, order, null);
不会报错,是因为此时虽然类型是匹配上了,但是你源对象填的orderDTO
,但是orderDTO
是刚new
出来的,啥属性也没有赋值那你怎么指望最后被赋值对象
order
里的字段有什么值呢?所以归根到底就是
create
时的source
和target
要与copy
时的对象顺序一致即可