feat(proxy): 实现代理对象初始化检查与懒加载机制
添加ProxyUtils工具类用于检查代理对象初始化状态 实现代理对象创建和标记初始化功能 添加ProxyObjectDeserializerModifier处理反序列化时的代理对象创建 修改WebSocketService错误消息字段从errorMsg改为message 实现ContractItemService.findAllByInventory方法 优化ContractService查询条件处理并添加缓存支持 重构InventoryTabSkinHistoryPrice的service获取方式
This commit is contained in:
@@ -1,13 +1,97 @@
|
||||
package com.ecep.contract.util;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Proxy;
|
||||
|
||||
import com.ecep.contract.model.IdentityEntity;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
|
||||
public class ProxyUtils {
|
||||
/**
|
||||
* 判断对象是否已初始化
|
||||
* 在客户端环境中,如果对象不为null,则认为已初始化
|
||||
* 在客户端环境中,从服务器端返回的数据中,代理对象序列化时只包含Id属性,
|
||||
* 其他属性为null,因此需要判断对象是否已初始化
|
||||
* 初始化条件:对象不为null,且不是代理对象或已被标记为初始化
|
||||
*/
|
||||
public static boolean isInitialized(Object proxy) {
|
||||
return proxy != null;
|
||||
if (proxy == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查 proxy 中除了id其他属性都为null
|
||||
try {
|
||||
Field[] fields = proxy.getClass().getFields();
|
||||
for (Field field : fields) {
|
||||
if (field.getName().equals("id")) {
|
||||
continue;
|
||||
}
|
||||
// 忽略被JsonIgnore注解标记的字段
|
||||
if (field.getAnnotation(JsonIgnore.class) != null) {
|
||||
continue;
|
||||
}
|
||||
// 检查字段是否为null
|
||||
if (field.get(proxy) != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// 如果除了id其他属性都为null,认为未初始化
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
// 发生异常时默认已初始化
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查对象是否是代理对象
|
||||
*/
|
||||
public static boolean isProxyObject(Object obj) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建代理对象
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T createProxy(T original, Class<?>... interfaces) {
|
||||
if (original == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果对象已经是代理对象,直接返回
|
||||
if (isProxyObject(original)) {
|
||||
return original;
|
||||
}
|
||||
|
||||
// 创建代理对象
|
||||
T proxy = (T) Proxy.newProxyInstance(
|
||||
original.getClass().getClassLoader(),
|
||||
interfaces,
|
||||
(proxyObj, method, args) -> {
|
||||
// 如果代理对象未初始化,先初始化
|
||||
if (!isInitialized(proxyObj)) {
|
||||
// 这里可以添加初始化逻辑
|
||||
markInitialized(proxyObj);
|
||||
}
|
||||
// 调用原始对象的方法
|
||||
return method.invoke(original, args);
|
||||
});
|
||||
return proxy;
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记对象为已初始化
|
||||
*/
|
||||
public static void markInitialized(Object proxy) {
|
||||
if (proxy != null && isProxyObject(proxy)) {
|
||||
// 标记为已初始化
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查对象是否是实体类
|
||||
*/
|
||||
public static boolean isEntityClass(Class<?> clazz) {
|
||||
return clazz != null && IdentityEntity.class.isAssignableFrom(clazz);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user