/** * @description: * @create: 2019-12-09 19:32 **/ @Component @Slf4j public class BeanTransformResolver { /** * 默认最大层级 */ private Integer DEFAULT_MAX_LEVEL = 3 ; /** * 初始级别 */ private Integer INIT_LEVEL = 1 ; @Autowired private FeignRunnable FeignRunnable; public Object execute(Object obj) { return transform(obj, this .DEFAULT_MAX_LEVEL); } public Object execute(Object obj, Integer maxLevel) { if (maxLevel == null || maxLevel < this .INIT_LEVEL) { maxLevel = this .DEFAULT_MAX_LEVEL; } return this .transform(obj, maxLevel); } private Object transform(Object obj, Integer maxLevel) { log.debug( "Method:transform start ... " ); if (obj == null ) { return obj; } Object pendingObj = this .getPendingObj(obj); Map<String, Set<Long>> transformResolverMap = new HashMap<>(); this .findSourceFieldValues(pendingObj, transformResolverMap, this .INIT_LEVEL, maxLevel); log.debug( "Method:transform transformResolverMap:{}" , JSON.toJSONString(transformResolverMap)); if (transformResolverMap.isEmpty()) { return obj; } CountDownLatch countDownLatch = new CountDownLatch(transformResolverMap.size()); for (String type : transformResolverMap.keySet()) { this .findDataAndTransformField(pendingObj, transformResolverMap, type, countDownLatch, maxLevel); } try { countDownLatch.await(); } catch (InterruptedException e) { log.error( "Method:transform countDownLatch.await error:{}" , e); } log.debug( "Method:transform end ... " ); return obj; } /** * 获取待处理对象 * * @param obj * @return */ private Object getPendingObj(Object obj) { // 处理PageInfo类型的列表 if (obj.getClass().equals(PageInfo. class )) { try { Field items = obj.getClass().getDeclaredField( "items" ); items.setAccessible( true ); return items.get(obj); } catch (NoSuchFieldException e) { log.error( "Method:getPendingObj NoSuchFieldException:{}" , e); } catch (IllegalAccessException e) { log.error( "Method:getPendingObj IllegalAccessException:{}" , e); } catch (Exception e) { log.error( "Method:getPendingObj Exception:{}" , e); } } return obj; } /** * 获取sourceField源字段值 * * @param obj * 对象 * @param transformResolverMap * 存储不同转换类型的源字段值的集合 key为TransformField 注解上type的值 ; value为TransformField注解上sourceFieldName * 对应的值的集合 * @param level * 层级 */ private void findSourceFieldValues(Object obj, Map<String, Set<Long>> transformResolverMap, Integer level, Integer maxLevel) { if (obj == null ) { return ; } if (obj instanceof List) { if (level < maxLevel) { Iterator iterator = ((List)obj).iterator(); while (iterator.hasNext()) { this .findSourceFieldValues(iterator.next(), transformResolverMap, level, maxLevel); } } return ; } resolverSourceFieldValues(obj, transformResolverMap, level, maxLevel, obj.getClass()); } private void resolverSourceFieldValues(Object obj, Map<String, Set<Long>> transformResolverMap, Integer level, Integer maxLevel, Class<?> objClass) { for (Field field : objClass.getDeclaredFields()) { field.setAccessible( true ); Optional.ofNullable(field.getAnnotation(TransformField. class )) .ifPresent(transformAnnotation -> { String type = transformAnnotation .type(); Set<Long> transformIds = transformResolverMap.get(type); if (transformIds == null ) { transformIds = new HashSet<>(); transformResolverMap.put(type, transformIds); } String sourceFieldName = transformAnnotation .sourceFieldName(); Object id = this .getFieldValue(obj, objClass, sourceFieldName); if (id instanceof Set){ transformIds.addAll((Set)id); } else if (id instanceof List){ transformIds.addAll((List) id); } else if (id != null ){ transformIds.add((Long) id); } }); Optional.ofNullable(field.getAnnotation(TransformBean. class )).ifPresent(transformBean -> { try { this .findSourceFieldValues(field.get(obj), transformResolverMap, level + 1 , maxLevel); } catch (Exception e) { log.error( "Method:findSourceFieldValues field name:{} error:{}" , field.getName(), e.getMessage()); } }); } Class<?> superclass = objClass.getSuperclass(); if (superclass != null && !superclass.equals(Object. class )){ this .resolverSourceFieldValues(obj, transformResolverMap, level, maxLevel, superclass); } } private Object getFieldValue(Object obj, Class<?> objClass, String fieldName) { try { Field sourceField = objClass.getDeclaredField(fieldName); sourceField.setAccessible( true ); return sourceField.get(obj); } catch (NoSuchFieldException e) { Class<?> superclass = objClass.getSuperclass(); if (superclass != null && !superclass.equals(Object. class )){ return this .getFieldValue(obj, superclass, fieldName); } log.error( "Method:getFieldValue 1 getDeclaredField fieldName:{} error:{}" , fieldName, e.getMessage()); } catch (IllegalAccessException e) { log.error( "Method:getFieldValue 2 反射{}值异常 error:{}" , fieldName, e.getMessage()); } catch (Exception e) { log.error( "Method:getFieldValue 3 fieldName:{} error:{}" , fieldName, e.getMessage()); } return null ; } /** * 查询并转换字段 * * @param obj * 待转换对象 * @param transformResolverMap * 存储不同转换类型的源字段值的集合 key为TransformField 注解上type的值 ; value为TransformField注解上sourceFieldName * 对应的值的集合 * @param type * 待转换类型 * @param countDownLatch */ private void findDataAndTransformField(Object obj, Map<String, Set<Long>> transformResolverMap, String type, CountDownLatch countDownLatch, Integer maxLevel) { Integer level = this .INIT_LEVEL; FeignRunnable.run(() -> { try { Optional.ofNullable(transformResolverMap.get(type)).ifPresent(ids -> { if (CollectionUtils.isEmpty(ids)){ return ; } TransformResolver transformResolver = (TransformResolver)SpringApplicationHolder.getBean(type); log.debug( "Method:findDataAndTransformField type:{} transformResolver.execute start ids:{}" , type, ids); Map<Long, Object> resultMap = transformResolver.execute(ids); log.debug( "Method:findDataAndTransformField type:{} transformResolver.execute end ids:{} resultMap:{}" , type, ids, JSON.toJSONString(resultMap)); if (resultMap == null || resultMap.isEmpty()) { return ; } log.debug( "Method:findDataAndTransformField type:{} transformBean start" , type); transformBean(obj, type, resultMap, level, maxLevel,obj.getClass()); log.debug( "Method:findDataAndTransformField type:{} transformBean end" , type); }); } catch (Exception e) { log.error( "Method:findDataAndTransformField type:{} error:{}" , type, e); } finally { countDownLatch.countDown(); } }); } /** * 转换Bean * * @param obj * 待转换对象 * @param type * 转换类型 * @param resultMap * 结果集 * @param level * 级别 */ private void transformBean(Object obj, String type, Map<Long, Object> resultMap, Integer level, Integer maxLevel,Class<?> beanClass) { if (obj == null ) { return ; } if (obj instanceof List) { if (level < maxLevel) { Iterator iterator = ((List)obj).iterator(); while (iterator.hasNext()) { Object next = iterator.next(); this .transformBean(next, type, resultMap, level, maxLevel,next.getClass()); } } return ; } for (Field field : beanClass.getDeclaredFields()) { field.setAccessible( true ); Optional.ofNullable(field.getAnnotation(TransformField. class )) .ifPresent(TransformAnnotation -> { String sourceFieldName = TransformAnnotation.sourceFieldName(); String transformFieldName = TransformAnnotation.transformFieldName(); try { // 待转换字段不为null时,跳过 if (!type.equals(TransformAnnotation.type()) || field.get(obj) != null ) { return ; } Field sourceField = beanClass.getDeclaredField(sourceFieldName); sourceField.setAccessible( true ); Object objValue = sourceField.get(obj); if (objValue == null ){ return ; } if (sourceField.getType().getName().equals(Set. class .getName())){ Set<Long> ids = (Set)sourceField.get(obj); List list = new ArrayList(); for (Long id : ids) { Optional.ofNullable( this .getTargetValue(resultMap, id, transformFieldName, sourceFieldName)) .ifPresent(value -> list.add(value)); } field.set(obj, list); } else if (sourceField.getType().getName().equals(List. class .getName())){ List<Long> ids = (List)sourceField.get(obj); List list = new ArrayList(); for (Long id : ids) { Optional.ofNullable( this .getTargetValue(resultMap, id, transformFieldName, sourceFieldName)) .ifPresent(value -> list.add(value)); } field.set(obj, list); } else { Long id = (Long)sourceField.get(obj); Object value = this .getTargetValue(resultMap, id, transformFieldName, sourceFieldName); if (value == null ){ return ; } field.set(obj, value); } } catch (Exception e) { log.error( "Method:transformBean 3 sourceFieldName:{} error:{}" , sourceFieldName, e.getMessage()); } }); Optional.ofNullable(field.getAnnotation(TransformBean. class )).ifPresent(TransformBean -> { try { Object v = field.get(obj); if (v != null ){ this .transformBean(v, type, resultMap, level + 1 , maxLevel,v.getClass()); } } catch (IllegalAccessException e) { log.error( "Method:transformBean field name:{} error:{}" , field.getName(), e.getMessage()); } }); } Class<?> superclass = beanClass.getSuperclass(); if (superclass != null && !superclass.equals(Object. class )){ this .transformBean(obj, type, resultMap, level, maxLevel, superclass); } } /** * 获取目标属性值 * * @param resultMap 结果集 * @param id 数据id * @param transformFieldName 转换字段 * @param sourceFieldName 待赋值字段 * @return */ private Object getTargetValue(Map<Long, Object> resultMap, Long id, String transformFieldName, String sourceFieldName) { Object result = resultMap.get(id); if (result == null || StringUtils.isBlank(transformFieldName)) { return result; } try { Field transformField = result.getClass().getDeclaredField(transformFieldName); transformField.setAccessible( true ); return transformField.get(result); } catch (NoSuchFieldException e) { log.error( "Method:getTargetValue 1 反射{}值异常 error:{}" , sourceFieldName, e.getMessage()); } catch (IllegalAccessException e) { log.error( "Method:getTargetValue 2 sourceFieldName:{} error:{}" , sourceFieldName, e.getMessage()); } return null ; } } |