diff --git a/bff-engine-core/pom.xml b/bff-engine-core/pom.xml index 37e41a5b1e646a997a55c75d6da4cd812d8b285c..422983cd4ce15853772182d70b3170c9a249c5ad 100644 --- a/bff-engine-core/pom.xml +++ b/bff-engine-core/pom.xml @@ -35,32 +35,32 @@ com.inspur.edp - common-entity-engine-core + common-entity-framework-api com.inspur.edp - cm-entity-framework-spi + common-entity-framework-spi com.inspur.edp - common-model + common-entity-engine-core com.inspur.edp - view-object-model + cm-entity-framework-spi com.inspur.edp - bff-engine-api - ${project.version} + common-model com.inspur.edp - common-entity-framework-api + view-object-model com.inspur.edp - common-entity-framework-spi + bff-engine-api + ${project.version} com.inspur.edp diff --git a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/BffEngineManagerImpl.java b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/BffEngineManagerImpl.java index 6aa265284c4dd96ca68295b9e791d041970c4325..ffc6f5da8944cd3b0150cba9ad0566624cd3fafc 100644 --- a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/BffEngineManagerImpl.java +++ b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/BffEngineManagerImpl.java @@ -626,13 +626,18 @@ public class BffEngineManagerImpl extends BffBuiltInManager implements BffEngine @Override public String serializeResponseInfo(ResponseInfo responseInfo, CefSerializeContext context) { + context.setEnableStdTimeFormat(this.vo.getEnableStdTimeFormat()); + //TODO:copy性能 ObjectMapper mapper = JSONSerializer.getObjectMapper().copy(); SimpleModule module = new SimpleModule(); BffEngineResponseConvertor convertor = new BffEngineResponseConvertor(this); setResponseExtList(convertor, this.getContext().getExtList()); convertor.setContext(context); - module.addSerializer(BffEngineResponseInfo.class, new BffEngineResponseConvertor(this)); + module.addSerializer(BffEngineResponseInfo.class, convertor); + //对于解析型场景,dataConverter恒等于null(原因是在bff层返回数据时,可能仅返回子表数据、子子标(不带主表),而二者的class类型相同, + // 通过module添加序列化器容易出现混乱 + mapper.setConfig(mapper.getSerializationConfig().withAttribute("SerializeContext", context)); mapper.registerModule(module); try { return filterResponseJson(mapper.writeValueAsString(responseInfo), responseInfo, context); diff --git a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/response/BffEngineResponseConvertor.java b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/response/BffEngineResponseConvertor.java index 92b11fb211ea3821d86ea9f38a11fc69956ba1c4..643f60556d4003ea052062849398e29fed2e441a 100644 --- a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/response/BffEngineResponseConvertor.java +++ b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/core/response/BffEngineResponseConvertor.java @@ -16,11 +16,28 @@ package com.inspur.edp.bff.engine.core.response; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.inspur.edp.bff.api.extend.IBffEntityExtend; import com.inspur.edp.bff.api.manager.IFSManager; import com.inspur.edp.bff.core.manager.FSManager; import com.inspur.edp.bff.engine.core.BffEngineManagerImpl; +import com.inspur.edp.bff.engine.entity.BffEngineChildData; +import com.inspur.edp.bff.engine.entity.serializer.ContextualEngineChildDataSerializer; +import com.inspur.edp.bff.spi.AbstractBffEntitySerConvertor; import com.inspur.edp.bff.spi.changeset.AbstractBffChangeJsonSerializer; import com.inspur.edp.bff.spi.response.ResponseConvertor; +import com.inspur.edp.cef.api.manager.serialize.CefSerializeContext; +import com.inspur.edp.cef.api.manager.serialize.JsonFormatType; +import com.inspur.edp.cef.entity.entity.IEntityData; +import com.inspur.edp.cef.entity.entity.IEntityDataCollection; +import com.inspur.edp.commonmodel.spi.AbstractEntityDataSerializer; + +import java.io.IOException; +import java.util.HashMap; public class BffEngineResponseConvertor extends ResponseConvertor { @@ -38,4 +55,78 @@ public class BffEngineResponseConvertor extends ResponseConvertor { protected AbstractBffChangeJsonSerializer getJsonConverter() { return ((BffEngineManagerImpl)fsManager).getEngineChangeSerializer(); } + + /** + * 对于解析型场景,bff层返回数据时,可能仅返回子表数据、子子标(不带主表),而二者的class类型相同,通过module添加序列化器容易出现混乱,所以采用 BffCommEngineDataSerializer序列化 + * @return + */ + @Override + protected AbstractBffEntitySerConvertor getDataJsonConverter() { + return ((BffEngineManagerImpl)fsManager).getEngineEntityDataSerializer(); + } + + @Override + protected void writeResult(JsonGenerator writer, Object result, SerializerProvider serializer) throws IOException { + + AbstractBffEntitySerConvertor dataConverter = getDataJsonConverter(); + + CefSerializeContext context = this.getContext(); + + //兼容原有逻辑,非平铺模式仍直接序列化 + if (context == null || context.getJsonFormatType() != JsonFormatType.Tiled) { + writer.writeObject(result); + return; + } + //注册BffEngineRootData的序列化器 + IEntityData data = fsManager.createData(); + Class dataClass = data.getClass().getSuperclass().getInterfaces()[0]; + ObjectMapper mapper = new ObjectMapper(); + if (this.getExtList() != null) { + this.getExtList().forEach(item -> dataConverter.addExtend(item)); + } + dataConverter.setCefSerializeContext(this.getContext()); + SimpleModule module = new SimpleModule(); + module.addSerializer(dataClass, dataConverter); + //注册BffEngineChildData的序列化器 + IBffEntityExtend rootEntityExtend = getRootEtityExtend(this.getExtList()); + addChildConverter(data, module, dataConverter, rootEntityExtend); + mapper.configure(MapperFeature.USE_ANNOTATIONS, false); + mapper.registerModule(module); + String value = mapper.writeValueAsString(result); + writer.writeRawValue(value); + } + + private void addChildConverter(IEntityData currentData, SimpleModule module, AbstractEntityDataSerializer dataConverter, IBffEntityExtend parentEntityExtend) { + HashMap childs = currentData.getChilds(); + if (childs == null || childs.isEmpty()) + return; + //添加子表上下文序列化器 + ContextualEngineChildDataSerializer childSerializer = new ContextualEngineChildDataSerializer(); + module.addSerializer(BffEngineChildData.class, childSerializer); + + //递归添加子表 + addChildConverter(currentData,childSerializer,dataConverter, parentEntityExtend); + } + + private void addChildConverter(IEntityData currentData,ContextualEngineChildDataSerializer childSerializer, + AbstractEntityDataSerializer dataConverter, IBffEntityExtend parentEntityExtend) { + HashMap childs = currentData.getChilds(); + if (childs == null || childs.isEmpty()) + return; + + for (String nodeCode : childs.keySet()) { + IEntityData childData = (IEntityData) currentData.createChild(nodeCode); + + //将当前子表的序列化器加入ContextualEngineChildDataSerializer + AbstractEntityDataSerializer childConvertor = dataConverter.getChildDataConvertor(nodeCode); + childConvertor.setCefSerializeContext(this.getContext()); + IBffEntityExtend childEtityExtend = getChildEtityExtend(parentEntityExtend, nodeCode); + if (childEtityExtend != null) { + childConvertor.addExtend(childEtityExtend); + } + childSerializer.addConvertor(nodeCode, childConvertor); + //递归childData的子表 + addChildConverter(childData, childSerializer, childConvertor, childEtityExtend); + } + } } diff --git a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/BffEngineChildDataSerializer.java b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/BffEngineChildDataSerializer.java index bf69d5a6872e3eec85f73f147dda1becafe2e115..30626d030edb5394949176585ede63135ce58e83 100644 --- a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/BffEngineChildDataSerializer.java +++ b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/BffEngineChildDataSerializer.java @@ -47,6 +47,6 @@ public class BffEngineChildDataSerializer extends AbstractBffEntitySerConvertor } @Override protected AbstractEntityDataSerializer getChildConvertor(String childCode){ IGspCommonObject childNode = CMUtil.checkNodeExists(node, childCode, null); - return new BffEngineChildDataSerializer(childNode,(CefEntityResInfoImpl) resInfo.getChildEntityResInfo(node.getCode())); + return new BffEngineChildDataSerializer(childNode,(CefEntityResInfoImpl) resInfo.getChildEntityResInfo(childNode.getCode())); } } diff --git a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/ContextualEngineChildDataSerializer.java b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/ContextualEngineChildDataSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..ef2236a35c292dd9609ebb72a8837df26f6dba65 --- /dev/null +++ b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/ContextualEngineChildDataSerializer.java @@ -0,0 +1,55 @@ +package com.inspur.edp.bff.engine.entity.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.inspur.edp.bff.engine.core.exception.BffEngineCoreErrorCodes; +import com.inspur.edp.bff.engine.core.exception.BffEngineCoreException; +import com.inspur.edp.bff.engine.entity.BffEngineChildData; +import com.inspur.edp.commonmodel.spi.AbstractEntityDataSerializer; +import io.iec.edp.caf.commons.utils.StringUtils; +import lombok.NonNull; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * 子表上下文序列化器 + * 对于解析型VO,不同层级的子表数据类型都是BffEngineChildData,无法都注册入序列化器中(存在覆盖) + * 通过此上下文序列化器,根据类型上的nodeCode进行动态判断 + */ +public class ContextualEngineChildDataSerializer extends JsonSerializer { + + private final Map convertorMap; + + public ContextualEngineChildDataSerializer() { + this.convertorMap = new HashMap<>(); + } + + /** + * 添加转换器 + * @param nodeCode + * @param convertor + */ + public void addConvertor(@NonNull String nodeCode,@NonNull AbstractEntityDataSerializer convertor) { + this.convertorMap.put(nodeCode, convertor); + } + + @Override + public void serialize(BffEngineChildData data, JsonGenerator gen, SerializerProvider provider) + throws IOException { + if(data==null){ + return; + } + if(data.getNode()== null || StringUtils.isEmpty(data.getNode().getCode()) + || !convertorMap.containsKey(data.getNode().getCode())){ + throw new BffEngineCoreException(BffEngineCoreErrorCodes.GSP_BFF_ENGINE_1021, "data does not contains any node code"); + } + + //依据nodeCode获取序列化器 + String nodeCode = data.getNode().getCode(); + AbstractEntityDataSerializer convertor = this.convertorMap.get(nodeCode); + convertor.serialize(data,gen,provider); + } +} \ No newline at end of file diff --git a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/common/BffCommEngineDataSerializer.java b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/common/BffCommEngineDataSerializer.java index 915398640711af5984e0b346c18494d270ddb93e..2c4aac00a12d6ae9231985df22b1e6402f665d4b 100644 --- a/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/common/BffCommEngineDataSerializer.java +++ b/bff-engine-core/src/main/java/com/inspur/edp/bff/engine/entity/serializer/common/BffCommEngineDataSerializer.java @@ -16,7 +16,34 @@ package com.inspur.edp.bff.engine.entity.serializer.common; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.inspur.edp.cef.api.manager.serialize.CefSerializeContext; +import com.inspur.edp.cef.entity.entity.ICefData; import com.inspur.edp.commonmodel.engine.core.data.serializer.CommEngineDataSerializer; +import java.io.IOException; + +/** + * 解析型的数据序列化器 + */ public class BffCommEngineDataSerializer extends CommEngineDataSerializer { + + /** + * 引擎数据序列化。重写此方法,仅为了获取SerializerProvider,设置序列化上下文 + * @param value + * @param jsonGenerator + * @param serializerProvider + * @throws IOException + * @throws JsonProcessingException + */ + public void serialize(ICefData value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + //设置序列化上下文 + CefSerializeContext serializeContext = (CefSerializeContext) serializerProvider.getAttribute("SerializeContext"); + if(serializeContext != null){ + setCefSerializeContext(serializeContext); + } + super.serialize(value, jsonGenerator, serializerProvider); + } } diff --git a/pom.xml b/pom.xml index 685a4feedd1e70bc8c05d9c57c719082951ee117..f0110d7f5c7253a3d241439e17644b1f9e1931b5 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ 0.1.6 0.1.7 0.1.2 - 0.1.6 + 0.3.2-SNAPSHOT 0.1.1 0.1.48 0.3.3