为何BeanCopier不起作用?

我想用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
怎么回事?

阅读 4.2k
1 个回答

你得先看看你这个orderCopier是怎么被create出来的噻,BeanCopier.create方法有三个参数

public static BeanCopier create(Class source, Class target, boolean useConverter)

这第一个参数代表源对象的Class,第二个参数代表目标对象的Class,从你报错来看,明显你的orderCopier对象被创建的时候,是写的create(OrderDTO.class, Order.class, false),所以你再调用copy方法的时候,你第一个参数填order,明显跟OrderDTO.class不匹配,当然就报了ClassCastException

至于为什么写orderCopier.copy(orderDTO, order, null);不会报错,是因为此时虽然类型是匹配上了,但是你源对象填的orderDTO,但是orderDTO是刚new出来的,啥属性也没有赋值
image.png

那你怎么指望最后被赋值对象order里的字段有什么值呢?

所以归根到底就是create时的sourcetarget要与copy时的对象顺序一致即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题