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