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

@@ -0,0 +1,95 @@
package com.ecep.contract.serializer;
import com.ecep.contract.model.IdentityEntity;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* 自定义的反序列化器修改器用于实现类似Hibernate的代理对象功能
*/
public class ProxyObjectDeserializerModifier extends BeanDeserializerModifier {
private final ObjectMapper objectMapper;
public ProxyObjectDeserializerModifier(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
// 检查是否是IdentityEntity的实现类
if (IdentityEntity.class.isAssignableFrom(beanDesc.getBeanClass())) {
// 返回包装后的反序列化器,处理代理对象的创建
return new ProxyObjectDeserializer((JsonDeserializer<Object>) deserializer,
beanDesc.getBeanClass(), objectMapper);
}
return deserializer;
}
/**
* 代理对象反序列化器,用于处理对象字段的懒加载
*/
private static class ProxyObjectDeserializer extends StdDeserializer<Object> implements ResolvableDeserializer {
private final JsonDeserializer<Object> delegate;
private final Class<?> targetClass;
private final ObjectMapper objectMapper;
@SuppressWarnings("unchecked")
public ProxyObjectDeserializer(JsonDeserializer<Object> delegate,
Class<?> targetClass, ObjectMapper objectMapper) {
super((Class<Object>) targetClass);
this.delegate = delegate;
this.targetClass = targetClass;
this.objectMapper = objectMapper;
}
@Override
public Object deserialize(com.fasterxml.jackson.core.JsonParser p,
com.fasterxml.jackson.databind.DeserializationContext ctxt) throws java.io.IOException {
// 首先检查是否是一个只有id的对象节点
if (p.isExpectedStartObjectToken()) {
ObjectNode node = p.readValueAsTree();
// 检查是否只包含id和_proxy_字段
if (node.has("id") && node.has("_proxy_")) {
try {
// 创建目标类的实例
Object instance = targetClass.getDeclaredConstructor().newInstance();
// 设置id字段
if (instance instanceof IdentityEntity) {
((IdentityEntity) instance).setId(node.get("id").asInt());
}
return instance;
} catch (Exception e) {
// 如果创建实例失败,回退到原始反序列化器
return delegate.deserialize(p, ctxt);
}
}
// 对于普通对象,使用原始反序列化器
return delegate.deserialize(p, ctxt);
}
// 对于非对象类型,使用原始反序列化器
return delegate.deserialize(p, ctxt);
}
@Override
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
// 如果委托的反序列化器也是ResolvableDeserializer则调用其resolve方法
if (delegate instanceof ResolvableDeserializer) {
((ResolvableDeserializer) delegate).resolve(ctxt);
}
}
}
}