Commit fbb315c7 authored by tianbo's avatar tianbo

refactor(amos): 优化字典参数转换和字段映射功能

- 修改 DictParamsConverter 中的字典项名称 - 优化 FieldMappingAspect 中的缓存配置和字段映射逻辑 -修正 FileFolderPathEnum 中的路径值
parent adb3b64b
...@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; ...@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -24,10 +25,16 @@ import java.util.concurrent.TimeUnit; ...@@ -24,10 +25,16 @@ import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
public class FieldMappingAspect { public class FieldMappingAspect {
@Value("${amos.fieldMapping.cache.maxSize:1000}")
private static int cacheMaxSize;
@Value("${amos.fieldMapping.cache.expireHours:1}")
private static int cacheExpireMinutes;
// 使用Guava Cache构建二级缓存 // 使用Guava Cache构建二级缓存
private static final LoadingCache<Class<?>, Map<String, Field>> FIELD_CACHE = CacheBuilder.newBuilder() private static final LoadingCache<Class<?>, Map<String, Field>> FIELD_CACHE = CacheBuilder.newBuilder()
.maximumSize(1000) // 控制最大缓存类数量 .maximumSize(cacheMaxSize) // 控制最大缓存类数量
.expireAfterAccess(1, TimeUnit.HOURS) // 访问1小时后过期 .expireAfterAccess(cacheExpireMinutes, TimeUnit.HOURS) // 访问1小时后过期
.weakKeys() // 使用弱引用键防止内存泄漏 .weakKeys() // 使用弱引用键防止内存泄漏
.build(new CacheLoader<Class<?>, Map<String, Field>>() { .build(new CacheLoader<Class<?>, Map<String, Field>>() {
// 当缓存未命中时,该方法会为指定类创建一个线程安全的空字段映射容器(ConcurrentHashMap),用于后续存储该类的反射字段信息 // 当缓存未命中时,该方法会为指定类创建一个线程安全的空字段映射容器(ConcurrentHashMap),用于后续存储该类的反射字段信息
...@@ -58,12 +65,14 @@ public class FieldMappingAspect { ...@@ -58,12 +65,14 @@ public class FieldMappingAspect {
public Object doFieldMapping(ProceedingJoinPoint joinPoint, FieldMapping fieldMapping) throws Throwable { public Object doFieldMapping(ProceedingJoinPoint joinPoint, FieldMapping fieldMapping) throws Throwable {
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
// 创建防御性副本
Object[] argsCopy = Arrays.copyOf(args, args.length);
// 遍历处理所有字段映射配置 // 遍历处理所有字段映射配置
for (FieldMapping.FieldMap mapping : fieldMapping.value()) { for (FieldMapping.FieldMap mapping : fieldMapping.value()) {
processSingleMapping(args, mapping); processSingleMapping(argsCopy, mapping);
} }
return joinPoint.proceed(args); return joinPoint.proceed(argsCopy);
} }
private void processSingleMapping(Object[] args, FieldMapping.FieldMap mapping) { private void processSingleMapping(Object[] args, FieldMapping.FieldMap mapping) {
...@@ -170,6 +179,10 @@ public class FieldMappingAspect { ...@@ -170,6 +179,10 @@ public class FieldMappingAspect {
return value; return value;
} }
// 增加枚举类型支持
if (targetType.isEnum()) {
return Enum.valueOf((Class<Enum>) targetType, value.toString());
}
if (targetType == String.class) return value.toString(); if (targetType == String.class) return value.toString();
if (targetType == int.class || targetType == Integer.class) { if (targetType == int.class || targetType == Integer.class) {
return Integer.parseInt(value.toString()); return Integer.parseInt(value.toString());
...@@ -233,7 +246,7 @@ public class FieldMappingAspect { ...@@ -233,7 +246,7 @@ public class FieldMappingAspect {
String part = parts[i]; String part = parts[i];
if (current instanceof Map) { if (current instanceof Map) {
current = ((Map<String, Object>) current).computeIfAbsent(part, k -> new HashMap<>()); current = ((Map<String, Object>) current).computeIfAbsent(part, k -> new ConcurrentHashMap<>());
} else { } else {
Field field = getCachedField(current.getClass(), part); Field field = getCachedField(current.getClass(), part);
if (field == null) return; if (field == null) return;
...@@ -320,7 +333,7 @@ public class FieldMappingAspect { ...@@ -320,7 +333,7 @@ public class FieldMappingAspect {
} }
} }
// 在FieldMappingAspect类内部添加 // 缓存方法内部类
private static class MethodKey { private static class MethodKey {
final Class<?> clazz; final Class<?> clazz;
final String methodName; final String methodName;
......
...@@ -78,7 +78,7 @@ public class DictParamsConverter implements Converter<String> { ...@@ -78,7 +78,7 @@ public class DictParamsConverter implements Converter<String> {
dictMap.put("集选", "1"); dictMap.put("集选", "1");
dictMap.put("并联", "2"); dictMap.put("并联", "2");
dictMap.put("按钮", "3"); dictMap.put("按钮", "3");
dictMap.put("其他控制方式", "4"); dictMap.put("其他", "4");
dictMap.put("直接顶升", "1"); dictMap.put("直接顶升", "1");
dictMap.put("间接顶升", "2"); dictMap.put("间接顶升", "2");
} }
......
...@@ -34,11 +34,11 @@ public enum FileFolderPathEnum { ...@@ -34,11 +34,11 @@ public enum FileFolderPathEnum {
/** /**
* 监管 * 监管
*/ */
JG("jg","/supma"), JG("jg","supma"),
/** /**
* 检验报告 * 检验报告
*/ */
JY("jg","/csei"), JY("jy","/csei"),
/** /**
* 检验检测 * 检验检测
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment