当前使用版本(必须填写清楚,否则不予处理)
v3.3.1
该问题是怎么引起的?(最新版上已修复的会直接close掉)
com.baomidou.mybatisplus.extension.plugins.pagination.Page
中optimizeCountSql hitCount 字段的set方法与lombok以及默认生成不一致,导致使用属性copy无法找到optimizeCountSql hitCount 字段的set方法,导致无法进行属性复制
//默认生成的
重现步骤
@Test
public void testMap() {
Page page1 = new Page();
page1.setOptimizeCountSql(false);
Page page2 = new Page();
copy(page1, page2);
System.out.println( "page1"+ page1.optimizeCountSql());
System.out.println( "page2"+ page2.optimizeCountSql());
}
/**
* BeanCopier的缓存
*/
static final ConcurrentHashMap<String, BeanCopier> BEAN_COPIER_CACHE = new ConcurrentHashMap<>();
/**
* BeanCopier的copy
*
* @param source 源文件的
* @param target 目标文件
*/
public static void copy(Object source, Object target) {
String key = genKey(source.getClass(), target.getClass());
BeanCopier beanCopier;
if (BEAN_COPIER_CACHE.containsKey(key)) {
beanCopier = BEAN_COPIER_CACHE.get(key);
} else {
beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
BEAN_COPIER_CACHE.put(key, beanCopier);
}
beanCopier.copy(source, target, null);
}
/**
* 生成key
*
* @param srcClazz 源文件的class
* @param tgtClazz 目标文件的class
* @return string
*/
private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
return srcClazz.getName() + tgtClazz.getName();
}
报错信息
Comment From: miemieYaho
这属性只有分页前是有用的,有什么必要还要在分页前copy一份出来?
Comment From: chengzichen
DTO BO 继承Page ,Feign 调用时转换需要
Comment From: nieqiurong
这里用BeanCopier应该还不止这几个问题,链式的set方法都会导致属性copy失败的,建议暂时换个属性拷贝的吧.
Comment From: chengzichen
换了hutool里的BeanUtils进行测试,是可以允许链式的set方法进行属性copy,但是方法名称问题还是会导致无法匹配找到optimizeCountSql字段的get方法 hitCount的set方法
把链式set方法和 默认set方法分开
public void setOptimizeCountSql(boolean optimizeCountSql) {
this. optimizeCountSql = optimizeCountSql;
}
public Page optimizeCountSql(boolean optimizeCountSql) {
setOptimizeCountSql(optimizeCountSql)
return this;
}
Comment From: nieqiurong
没用过hutool,暂时只用了mybatis自带的和spring的拷贝做了简单的测试,各个框架用拷贝的方式不一样,暂时无法做到一一满足.