Commit fbb315c7 authored by tianbo's avatar tianbo

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

- 修改 DictParamsConverter 中的字典项名称 - 优化 FieldMappingAspect 中的缓存配置和字段映射逻辑 -修正 FileFolderPathEnum 中的路径值
parent adb3b64b
......@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
......@@ -24,10 +25,16 @@ import java.util.concurrent.TimeUnit;
@Slf4j
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构建二级缓存
private static final LoadingCache<Class<?>, Map<String, Field>> FIELD_CACHE = CacheBuilder.newBuilder()
.maximumSize(1000) // 控制最大缓存类数量
.expireAfterAccess(1, TimeUnit.HOURS) // 访问1小时后过期
.maximumSize(cacheMaxSize) // 控制最大缓存类数量
.expireAfterAccess(cacheExpireMinutes, TimeUnit.HOURS) // 访问1小时后过期
.weakKeys() // 使用弱引用键防止内存泄漏
.build(new CacheLoader<Class<?>, Map<String, Field>>() {
// 当缓存未命中时,该方法会为指定类创建一个线程安全的空字段映射容器(ConcurrentHashMap),用于后续存储该类的反射字段信息
......@@ -58,12 +65,14 @@ public class FieldMappingAspect {
public Object doFieldMapping(ProceedingJoinPoint joinPoint, FieldMapping fieldMapping) throws Throwable {
Object[] args = joinPoint.getArgs();
// 创建防御性副本
Object[] argsCopy = Arrays.copyOf(args, args.length);
// 遍历处理所有字段映射配置
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) {
......@@ -170,6 +179,10 @@ public class FieldMappingAspect {
return value;
}
// 增加枚举类型支持
if (targetType.isEnum()) {
return Enum.valueOf((Class<Enum>) targetType, value.toString());
}
if (targetType == String.class) return value.toString();
if (targetType == int.class || targetType == Integer.class) {
return Integer.parseInt(value.toString());
......@@ -233,7 +246,7 @@ public class FieldMappingAspect {
String part = parts[i];
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 {
Field field = getCachedField(current.getClass(), part);
if (field == null) return;
......@@ -320,7 +333,7 @@ public class FieldMappingAspect {
}
}
// 在FieldMappingAspect类内部添加
// 缓存方法内部类
private static class MethodKey {
final Class<?> clazz;
final String methodName;
......
......@@ -78,7 +78,7 @@ public class DictParamsConverter implements Converter<String> {
dictMap.put("集选", "1");
dictMap.put("并联", "2");
dictMap.put("按钮", "3");
dictMap.put("其他控制方式", "4");
dictMap.put("其他", "4");
dictMap.put("直接顶升", "1");
dictMap.put("间接顶升", "2");
}
......
......@@ -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