dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
28.91k stars 7.48k forks source link

BeanUtil对代理类型源对象拷贝失败 #3648

Closed taowater closed 1 month ago

taowater commented 1 month ago

版本情况

JDK版本: openjdk_17 hutool版本: 5.8.29(请确保最新尝试是否还有问题)

问题描述(包括截图)

  1. 复现代码

涉及jpa的pojo生成

  1. 堆栈信息 image image

BeanUtil.copyProperties(source, target, false);

大佬好,这边在使用BeanUtil的时候遇到了一些问题, source是jpa在自定义sql返回的一个代理pojo(因为jpa的限制,自定义sql组装自定义pojo,需要定义为接口,它底层搞一个代理实体) 这时候拷贝是失败的,我跟踪了对应代码,发现在BeanToBeanCopier的copy方法中 final Map<String, PropDesc> sourcePropDescMap = BeanUtil.getBeanDesc(source.getClass()).getPropMap(copyOptions.ignoreCase); 取得的只有一个"h"属性,亦即把代理类当普通类去处理了,导致拷贝失败。 这边尝试了用spring的拷贝工具是可以正常拷贝的,请大佬考虑一下这个问题

looly commented 1 month ago

Hutool中对Bean的定义规则导致的。

Hutool中定义Bean必须含有字段和Getter方法才可以,如果一个Bean(如代理bean)是没有字段的,因此无法匹配字段,导致拷贝失败。

对于代理类这种特殊对象,考虑将代理类包装为ValueProvider即可。