feat(proxy): 实现代理对象初始化检查与懒加载机制

添加ProxyUtils工具类用于检查代理对象初始化状态
实现代理对象创建和标记初始化功能
添加ProxyObjectDeserializerModifier处理反序列化时的代理对象创建
修改WebSocketService错误消息字段从errorMsg改为message
实现ContractItemService.findAllByInventory方法
优化ContractService查询条件处理并添加缓存支持
重构InventoryTabSkinHistoryPrice的service获取方式
This commit is contained in:
2025-09-12 16:00:45 +08:00
parent 422994efcd
commit 98e48c520f
7 changed files with 243 additions and 33 deletions

View File

@@ -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);
}
}