From a53ab71161c5a546c70fa22ec5530cc4b2c7a672 Mon Sep 17 00:00:00 2001 From: wangting <675591594@qq.com> Date: 星期二, 03 十二月 2024 17:12:07 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 204 insertions(+), 0 deletions(-) diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java index 0fc3a78..379ad98 100644 --- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java +++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java @@ -1,12 +1,17 @@ package com.vci.starter.web.util; +import com.vci.starter.web.toolmodel.DateConverter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.cglib.beans.BeanCopier; +import org.springframework.cglib.core.Converter; import org.springframework.util.CollectionUtils; import java.lang.reflect.Field; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * 涓氬姟绫诲瀷涓撶敤鐨勬嫹璐濆伐鍏凤紝杩欎釜鏄祬鎷疯礉锛� @@ -19,6 +24,11 @@ * 鏃ュ織 */ private static Logger logger = LoggerFactory.getLogger(BeanUtilForVCI.class); + + /** + * 瀛樻斁鎷疯礉瀵硅薄鐨勭紦瀛� + */ + private static final ConcurrentMap<String, BeanCopier> beanCopierMap = new ConcurrentHashMap<>(); /** * 鎷疯礉鏁版嵁 @@ -255,4 +265,198 @@ } } + /** + * 鑾峰彇绫绘嫹璐濈殑瀵硅薄 + * @param source 婧愬璞$被 + * @param target 鐩爣瀵硅薄绫� + * @param useConverter 鏄惁浣跨敤杞崲鍣� + * @return 鎷疯礉瀵硅薄 + */ + public static BeanCopier getBeanCopier(Class<?> source, Class<?> target,boolean useConverter) { + String beanCopierKey = generateBeanKey(source, target); + if (beanCopierMap.containsKey(beanCopierKey)) { + return beanCopierMap.get(beanCopierKey); + } else { + BeanCopier beanCopier = BeanCopier.create(source, target, useConverter); + beanCopierMap.putIfAbsent(beanCopierKey, beanCopier); + } + return beanCopierMap.get(beanCopierKey); + } + + /** + * 鐢熸垚涓や釜绫荤殑key,鐢ㄤ簬瀛樻斁鍒扮紦瀛樹箣涓� + * @param source 婧愬璞$被鍨� + * @param target 鐩爣瀵硅薄绫� + * @return 涓や釜绫荤殑鍚嶇О杩炴帴鍒颁竴璧峰悗鐨勫悕瀛� + */ + public static String generateBeanKey(Class<?> source, Class<?> target) { + return source.getName() + "@" + target.getName(); + } + + /** + * 涓や釜瀵硅薄涔嬮棿杞崲 + * @param source 婧愬璞� + * @param target 鐩爣瀵硅薄 + * @param useConvert 鏄惁浣跨敤榛樿鐨勮浆鎹㈠櫒锛岃鍦ㄥ嚭鐜板睘鎬у悕绉扮浉鍚岃�岀被鍨嬩笉鍚岋紝鎴栬�呮湁瀵硅薄绫诲瀷锛岄泦鍚堝睘鎬ф椂鎵嶈浆鎹� + */ + public static void convert(Object source,Object target,boolean useConvert){ + if(source != null && target !=null){ + BeanCopier beanCopier = getBeanCopier(source.getClass(),target.getClass(),useConvert); + beanCopier.copy(source,target,useConvert?new DeepCopyConverter(target):null); + } + } + + /** + * 涓や釜瀵硅薄涔嬮棿杞崲 + * @param source 婧愬璞� + * @param target 鐩爣瀵硅薄 + * @return 鐩爣瀵硅薄 + */ + public static void convert(Object source,Object target){ + convert(source,target,true); + } + + /** + * 娣卞害鎷疯礉杞崲鍣� + */ + public static class DeepCopyConverter implements Converter { + + /** + * 鐩爣瀵硅薄 + */ + private Object target; + + /** + * 鏋勯�犳柟娉� + * @param target 鐩爣瀵硅薄 + */ + public DeepCopyConverter(Object target) { + this.target = target; + } + + /** + * 鎵ц鎷疯礉 + * @param value 婧愬璞$殑灞炴�х殑鍊� + * @param targetClazz 鐩爣瀵硅薄鐨勫睘鎬х殑绫� + * @param methodName set鏂规硶鐨勫悕瀛� + * @return 杞崲鍚庣殑鍊� + */ + @Override + public Object convert(Object value, Class targetClazz, Object methodName) { + if (value instanceof List) { + List values = (List) value; + List retList = new ArrayList<>(values.size()); + copyForCollection(values,retList,methodName); + return retList; + } else if(value instanceof Set){ + Set values = (Set) value; + Set retSet = new HashSet<>(); + copyForCollection(values,retSet,methodName); + } else if(value instanceof Vector){ + Vector values = (Vector)value; + Vector retVector = new Vector(); + copyForCollection(values,retVector,methodName); + }else if (value instanceof Map) { + Map values = (Map)value; + Map retMap = new HashMap(); + for (final Object key : values.keySet()) { + Object mapValue = values.get(key); + String tempFieldName = methodName.toString().replace("set", + ""); + String fieldName = tempFieldName.substring(0, 1) + .toLowerCase() + tempFieldName.substring(1); + Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName); + Object targetAttr = null; + try{ + targetAttr = clazz.newInstance(); + }catch (Throwable e){ + //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊 + } + BeanUtilForVCI.convert(mapValue, targetAttr); + retMap.put(key,targetAttr); + } + } else if (!ClassUtilForVCI.isPrimitive(targetClazz)) { + //杩欎釜鏄璞$被鍨� + Object targetAttr = null; + try{ + targetAttr = targetClazz.newInstance(); + }catch (Throwable e){ + //鏂扮殑瀵硅薄灞炴�у垵濮嬪寲鍑洪敊 + } + BeanUtilForVCI.convert(value, targetAttr); + return targetAttr; + } + if(value instanceof Boolean && targetClazz.equals(String.class)){ + //浠巄oolean鎷疯礉鍒皊tring + return String.valueOf(value); + } + if(value instanceof String && (targetClazz.equals(Boolean.class) + || targetClazz.equals(boolean.class))){ + //浠嶴tring鎷疯礉鍒癰oolean + if("true".equalsIgnoreCase((String)value)){ + return true; + }else{ + return false; + } + } + if(value instanceof Date && targetClazz.equals(String.class)){ + //鏃堕棿鏍煎紡 + return VciDateUtil.date2Str((Date)value,VciDateUtil.DateTimeMillFormat); + } + if(value instanceof String && targetClazz.equals(Date.class)){ + //杞崲 + DateConverter dateConverter = new DateConverter(); + dateConverter.setAsText((String)value); + return dateConverter.getValue(); + } + return value; + } + + /** + * 澶勭悊闆嗗悎灞炴�� + * @param sourceCollection 婧愬璞′腑闆嗗悎灞炴�х殑鐨勫�� + * @param targetCollection 鐩爣瀵硅薄鐨勯泦鍚堝睘鎬х殑鍊� + * @param methodName setter鏂规硶 + */ + private void copyForCollection(Collection<?> sourceCollection,Collection targetCollection,Object methodName){ + for (final Object source : sourceCollection) { + if(source instanceof Collection){ + List<Object> targetValues = new ArrayList<>(); + copyForCollection((Collection<?>)source,targetValues,methodName); + targetCollection.add(targetValues); + }else if(source instanceof Map){ + String tempFieldName = methodName.toString().replace("set", + ""); + String fieldName = tempFieldName.substring(0, 1) + .toLowerCase() + tempFieldName.substring(1); + Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName); + Object targetAttr = null; + try { + targetAttr = clazz.newInstance(); + } catch (Throwable e) { + //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊 + } + Map map = (Map) source; + for(Object key : map.keySet()){ + VciBaseUtil.setValueForField(key.toString(),targetAttr,VciBaseUtil.getStringValueFromObject(map.get(key))); + } + targetCollection.add(targetAttr); + }else { + String tempFieldName = methodName.toString().replace("set", + ""); + String fieldName = tempFieldName.substring(0, 1) + .toLowerCase() + tempFieldName.substring(1); + Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName); + Object targetAttr = null; + try { + targetAttr = clazz.newInstance(); + } catch (Throwable e) { + //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊 + } + BeanUtilForVCI.convert(source, targetAttr); + targetCollection.add(targetAttr); + } + } + } + } } -- Gitblit v1.9.3