Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java =================================================================== diff -u -r32981 -r33138 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 32981) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 33138) @@ -17,7 +17,6 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; -import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -76,6 +75,7 @@ import com.forgon.security.service.AclTools; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.BeanUtils; import com.forgon.tools.GB2Alpha; import com.forgon.tools.GB2WB; import com.forgon.tools.MathTools; @@ -1834,9 +1834,8 @@ }*/ ForeignTousseApplication splitApplication = new ForeignTousseApplication(); - BeanUtils.copyProperties(splitApplication, foreignTousseApplication); + BeanUtils.safelyShallowCloneNullCollectField(splitApplication, foreignTousseApplication); splitApplication.setId(null); - splitApplication.setInvoice(null); splitApplication.setSerialNumber(serialNumManager.getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION)); // 生成备注:“本申请单于2021-04-21 17:20由“原申请单流水号”中的”器械包名称“更改病人住院号后生成” String tousseNames = ""; @@ -1890,7 +1889,7 @@ List newApplicationItems = new ArrayList(); for (TousseItem tousseItem : splitApplicationItems) { TousseItem ti = new TousseItem(); - BeanUtils.copyProperties(ti, tousseItem); + BeanUtils.safelyShallowCloneNullCollectField(ti, tousseItem); ti.setId(null); ti.setInvoicePlan(null); ti.setInvoicePlanID(null); Index: forgon-tools/src/main/java/com/forgon/tools/BeanUtils.java =================================================================== diff -u -r18645 -r33138 --- forgon-tools/src/main/java/com/forgon/tools/BeanUtils.java (.../BeanUtils.java) (revision 18645) +++ forgon-tools/src/main/java/com/forgon/tools/BeanUtils.java (.../BeanUtils.java) (revision 33138) @@ -1,5 +1,13 @@ package com.forgon.tools; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.commons.beanutils.BeanUtilsBean2; /** @@ -22,4 +30,48 @@ } return thisNewOne; } + + /** + * 对bean进行浅复制。集合类型的成员变量赋值为NULL + * @param bean + * @return + */ + public static T safelyShallowCloneNullCollectField(T dest, T orig){ + + if(dest == null || orig == null){ + return null; + } + + try { + org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orig); + List fieldList = new ArrayList<>(); + //获取当前类及其父类的属性 + Class clazz = orig.getClass(); + while (clazz != null){ + fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); + clazz = clazz.getSuperclass(); + } + for (Field field : fieldList) { + //打开私有访问 + boolean canAccess = field.isAccessible(); + if (!canAccess) { + field.setAccessible(true); + } + //集合类型的成员变量赋值为NULL + Object fieldValue = field.get(dest); + if(fieldValue == null + || fieldValue instanceof Set + || fieldValue instanceof Map + || fieldValue instanceof List + || fieldValue instanceof Collection){ + field.set(dest, null); + } + field.setAccessible(canAccess); + } + } catch (Exception e) { + e.printStackTrace(); + } + return dest; + } + }