You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2019/10/07 09:36:09 UTC

[servicecomb-java-chassis] branch master updated: [SCB-1492] add ModelResolveObjectMapperProvider

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 8e665bf  [SCB-1492] add ModelResolveObjectMapperProvider
8e665bf is described below

commit 8e665bfd518d4872c324a2d123f5619aa19e997f
Author: yhs0092 <yh...@163.com>
AuthorDate: Tue Sep 17 21:45:12 2019 +0800

    [SCB-1492] add ModelResolveObjectMapperProvider
    
    To allow users to custom the ObjectMapper used in schema generation
---
 .../DefaultModelResolveObjectMapperProvider.java   | 38 ++++++++++++++++++++++
 .../extend/ModelResolveObjectMapperProvider.java   | 37 +++++++++++++++++++++
 .../swagger/extend/ModelResolverExt.java           | 23 +++++++++----
 3 files changed, 91 insertions(+), 7 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/DefaultModelResolveObjectMapperProvider.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/DefaultModelResolveObjectMapperProvider.java
new file mode 100644
index 0000000..9f5093c
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/DefaultModelResolveObjectMapperProvider.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.swagger.extend;
+
+import org.apache.servicecomb.swagger.extend.module.EnumModuleExt;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import io.swagger.util.Json;
+
+public class DefaultModelResolveObjectMapperProvider implements ModelResolveObjectMapperProvider {
+  @Override
+  public int getOrder() {
+    return 100;
+  }
+
+  @Override
+  public ObjectMapper getMapper() {
+    ObjectMapper mapper = Json.mapper();
+    mapper.registerModule(new EnumModuleExt());
+    return mapper;
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolveObjectMapperProvider.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolveObjectMapperProvider.java
new file mode 100644
index 0000000..68e05da
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolveObjectMapperProvider.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.swagger.extend;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Implement this interface to create custom {@link ObjectMapper} for Swagger schema generation.
+ */
+public interface ModelResolveObjectMapperProvider {
+  /**
+   * @return order The smaller value it is, the higher priority this provider has.
+   */
+  default int getOrder() {
+    return 0;
+  }
+
+  /**
+   * @return the ObjectMapper, which is used by Swagger to introspect the param types and generate property collections.
+   */
+  ObjectMapper getMapper();
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolverExt.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolverExt.java
index 81b6d30..854b10d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolverExt.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/extend/ModelResolverExt.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.swagger.converter.property.StringPropertyConverter;
-import org.apache.servicecomb.swagger.extend.module.EnumModuleExt;
 import org.apache.servicecomb.swagger.extend.property.creator.ByteArrayPropertyCreator;
 import org.apache.servicecomb.swagger.extend.property.creator.BytePropertyCreator;
 import org.apache.servicecomb.swagger.extend.property.creator.InputStreamPropertyCreator;
@@ -46,11 +45,12 @@ import io.swagger.models.Model;
 import io.swagger.models.ModelImpl;
 import io.swagger.models.properties.Property;
 import io.swagger.models.properties.StringProperty;
-import io.swagger.util.Json;
 
 public class ModelResolverExt extends ModelResolver {
   private Map<Class<?>, PropertyCreator> propertyCreatorMap = new HashMap<>();
 
+  private static ObjectMapper objectMapper;
+
   public ModelResolverExt() {
     super(findMapper());
 
@@ -63,9 +63,18 @@ public class ModelResolverExt extends ModelResolver {
   }
 
   private static ObjectMapper findMapper() {
-    ObjectMapper mapper = Json.mapper();
-    mapper.registerModule(new EnumModuleExt());
-    return mapper;
+    if (null != objectMapper) {
+      return objectMapper;
+    }
+
+    ModelResolveObjectMapperProvider objectMapperProvider = SPIServiceUtils
+        .getPriorityHighestService(ModelResolveObjectMapperProvider.class);
+    if (null == objectMapperProvider) {
+      objectMapperProvider = new DefaultModelResolveObjectMapperProvider();
+    }
+    objectMapper = objectMapperProvider.getMapper();
+
+    return objectMapper;
   }
 
   private void addPropertyCreator(PropertyCreator creator) {
@@ -130,7 +139,7 @@ public class ModelResolverExt extends ModelResolver {
     checkType(type);
 
     // 只有声明model的地方才需要标注类型
-    if (ModelImpl.class.isInstance(model) && !StringUtils.isEmpty(((ModelImpl) model).getName())) {
+    if (model instanceof ModelImpl && !StringUtils.isEmpty(((ModelImpl) model).getName())) {
       setType(type, model.getVendorExtensions());
     }
     return model;
@@ -147,7 +156,7 @@ public class ModelResolverExt extends ModelResolver {
     }
 
     Property property = super.resolveProperty(propType, context, annotations, next);
-    if (StringProperty.class.isInstance(property)) {
+    if (property instanceof StringProperty) {
       if (StringPropertyConverter.isEnum((StringProperty) property)) {
         setType(propType, property.getVendorExtensions());
       }