资源相关
This commit is contained in:
		| @ -0,0 +1,256 @@ | ||||
| package com.yj.earth.common.service; | ||||
|  | ||||
| import com.fasterxml.jackson.core.JsonProcessingException; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.fasterxml.jackson.databind.SerializationFeature; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.lang.reflect.*; | ||||
| import java.util.*; | ||||
|  | ||||
| @Component | ||||
| public class SourceDataGenerator { | ||||
|  | ||||
|     @Resource | ||||
|     private SourceParamsValidator sourceParamsValidator; | ||||
|  | ||||
|     private static final ObjectMapper objectMapper; | ||||
|  | ||||
|     static { | ||||
|         // 初始化ObjectMapper并配置 | ||||
|         objectMapper = new ObjectMapper(); | ||||
|         // 允许序列化空对象 | ||||
|         objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); | ||||
|         // 格式化输出 | ||||
|         objectMapper.enable(SerializationFeature.INDENT_OUTPUT); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 生成包含完整层级结构的默认JSON | ||||
|      */ | ||||
|     public String generateDefaultJson(String sourceType) throws JsonProcessingException { | ||||
|         // 获取目标类 | ||||
|         Class<?> targetClass = sourceParamsValidator.getSourceTypeMap().get(sourceType); | ||||
|         if (targetClass == null) { | ||||
|             throw new IllegalArgumentException("不支持的资源类型: " + sourceType); | ||||
|         } | ||||
|         return generateJsonStructure(targetClass); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据类生成JSON结构字符串 | ||||
|      * @param clazz 目标类 | ||||
|      * @return 完整结构的JSON字符串 | ||||
|      */ | ||||
|     public static String generateJsonStructure(Class<?> clazz) throws JsonProcessingException { | ||||
|         Object instance = initializeObject(clazz); | ||||
|         return objectMapper.writeValueAsString(instance); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 递归初始化对象(包括嵌套类、集合、数组) | ||||
|      */ | ||||
|     private static Object initializeObject(Class<?> clazz) { | ||||
|         try { | ||||
|             // 处理数组类型 | ||||
|             if (clazz.isArray()) { | ||||
|                 return initializeArray(clazz); | ||||
|             } | ||||
|  | ||||
|             // 处理基本类型包装类或字符串(直接返回默认值) | ||||
|             if (isPrimitiveOrWrapper(clazz) || clazz.equals(String.class)) { | ||||
|                 return getDefaultValue(clazz); | ||||
|             } | ||||
|  | ||||
|             // 处理集合接口(直接实例化为ArrayList/HashSet等) | ||||
|             if (clazz.isInterface()) { | ||||
|                 if (List.class.isAssignableFrom(clazz)) { | ||||
|                     clazz = ArrayList.class; | ||||
|                 } else if (Set.class.isAssignableFrom(clazz)) { | ||||
|                     clazz = HashSet.class; | ||||
|                 } else if (Map.class.isAssignableFrom(clazz)) { | ||||
|                     clazz = HashMap.class; | ||||
|                 } else { | ||||
|                     // 其他接口默认返回null(避免无法实例化) | ||||
|                     return null; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // 创建类实例(支持static内部类) | ||||
|             Constructor<?> constructor = clazz.getDeclaredConstructor(); | ||||
|             constructor.setAccessible(true); // 允许访问私有构造函数 | ||||
|             Object instance = constructor.newInstance(); | ||||
|  | ||||
|             // 初始化所有字段 | ||||
|             for (Field field : clazz.getDeclaredFields()) { | ||||
|                 field.setAccessible(true); | ||||
|                 Class<?> fieldType = field.getType(); | ||||
|  | ||||
|                 // 跳过静态字段(通常不需要序列化静态成员) | ||||
|                 if (Modifier.isStatic(field.getModifiers())) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 // 基本类型、包装类、字符串:直接设默认值 | ||||
|                 if (isPrimitiveOrWrapper(fieldType) || fieldType.equals(String.class)) { | ||||
|                     field.set(instance, getDefaultValue(fieldType)); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 // 处理数组 | ||||
|                 if (fieldType.isArray()) { | ||||
|                     field.set(instance, initializeArray(fieldType)); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 // 处理集合 | ||||
|                 if (Collection.class.isAssignableFrom(fieldType)) { | ||||
|                     field.set(instance, initializeCollection(field)); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 // 处理Map | ||||
|                 if (Map.class.isAssignableFrom(fieldType)) { | ||||
|                     field.set(instance, initializeMap(field)); | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 // 处理嵌套对象(包括static内部类) | ||||
|                 field.set(instance, initializeObject(fieldType)); | ||||
|             } | ||||
|  | ||||
|             return instance; | ||||
|         } catch (Exception e) { | ||||
|             throw new RuntimeException("初始化对象失败: " + clazz.getName(), e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 初始化数组 | ||||
|      */ | ||||
|     private static Object initializeArray(Class<?> arrayType) { | ||||
|         Class<?> componentType = arrayType.getComponentType(); | ||||
|         // 创建长度为1的数组 | ||||
|         Object array = Array.newInstance(componentType, 1); | ||||
|  | ||||
|         // 初始化数组元素(字符串类型会返回空字符串) | ||||
|         try { | ||||
|             Object element = initializeObject(componentType); | ||||
|             Array.set(array, 0, element); | ||||
|         } catch (Exception e) { | ||||
|             // 初始化失败时设置为对应类型的默认值(字符串为"") | ||||
|             Array.set(array, 0, getDefaultValue(componentType)); | ||||
|         } | ||||
|         return array; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 初始化集合 | ||||
|      */ | ||||
|     private static Collection<?> initializeCollection(Field field) { | ||||
|         Class<?> fieldType = field.getType(); | ||||
|         Type genericType = field.getGenericType(); | ||||
|         Collection<Object> collection; | ||||
|  | ||||
|         // 创建具体集合实例 | ||||
|         try { | ||||
|             if (fieldType.isInterface()) { | ||||
|                 collection = new ArrayList<>(); | ||||
|             } else { | ||||
|                 collection = (Collection<Object>) fieldType.getDeclaredConstructor().newInstance(); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             collection = new ArrayList<>(); | ||||
|         } | ||||
|  | ||||
|         // 处理泛型元素(字符串类型会添加空字符串) | ||||
|         if (genericType instanceof ParameterizedType) { | ||||
|             Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments(); | ||||
|             if (actualTypeArguments.length > 0 && actualTypeArguments[0] instanceof Class) { | ||||
|                 Class<?> elementType = (Class<?>) actualTypeArguments[0]; | ||||
|                 try { | ||||
|                     Object element = initializeObject(elementType); | ||||
|                     collection.add(element); | ||||
|                 } catch (Exception e) { | ||||
|                     // 元素初始化失败时添加默认值(字符串为"") | ||||
|                     collection.add(getDefaultValue(elementType)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return collection; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 初始化Map | ||||
|      */ | ||||
|     private static Map<?, ?> initializeMap(Field field) { | ||||
|         Class<?> fieldType = field.getType(); | ||||
|         Type genericType = field.getGenericType(); | ||||
|         Map<Object, Object> map; | ||||
|  | ||||
|         // 创建具体Map实例 | ||||
|         try { | ||||
|             if (fieldType.isInterface()) { | ||||
|                 map = new HashMap<>(); | ||||
|             } else { | ||||
|                 map = (Map<Object, Object>) fieldType.getDeclaredConstructor().newInstance(); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             map = new HashMap<>(); | ||||
|         } | ||||
|  | ||||
|         // 处理泛型键值对(value为字符串时设为空字符串) | ||||
|         if (genericType instanceof ParameterizedType) { | ||||
|             Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments(); | ||||
|             if (actualTypeArguments.length == 2) { | ||||
|                 try { | ||||
|                     // key默认用字符串"key",value按泛型类型设默认值(字符串为"") | ||||
|                     Object key = "key"; | ||||
|                     Object value = actualTypeArguments[1] instanceof Class | ||||
|                             ? initializeObject((Class<?>) actualTypeArguments[1]) | ||||
|                             : getDefaultValue(String.class); // 非Class类型默认空字符串 | ||||
|                     map.put(key, value); | ||||
|                 } catch (Exception e) { | ||||
|                     // 初始化失败时value设为对应类型默认值(字符串为"") | ||||
|                     map.put("key", getDefaultValue(actualTypeArguments[1] instanceof Class ? (Class<?>) actualTypeArguments[1] : String.class)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return map; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 判断是否为基本类型或包装类 | ||||
|      */ | ||||
|     private static boolean isPrimitiveOrWrapper(Class<?> type) { | ||||
|         return type.isPrimitive() | ||||
|                 || type.equals(Boolean.class) | ||||
|                 || type.equals(Byte.class) | ||||
|                 || type.equals(Short.class) | ||||
|                 || type.equals(Integer.class) | ||||
|                 || type.equals(Long.class) | ||||
|                 || type.equals(Float.class) | ||||
|                 || type.equals(Double.class) | ||||
|                 || type.equals(Character.class); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取类型默认值:字符串返回空字符串,其他类型按原有逻辑 | ||||
|      */ | ||||
|     private static Object getDefaultValue(Class<?> type) { | ||||
|         if (type.equals(String.class)) { | ||||
|             return ""; | ||||
|         } | ||||
|         // 原有逻辑:基本类型返回对应默认值(boolean=false/数值=0/char='\0') | ||||
|         if (type.isPrimitive()) { | ||||
|             if (type == boolean.class) return false; | ||||
|             if (type == char.class) return '\0'; | ||||
|             return 0; // 所有数值类型(byte/short/int/long/float/double)默认0 | ||||
|         } | ||||
|         // 包装类(如Integer/Boolean)默认返回null(保持原有逻辑) | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 ZZX9599
					ZZX9599