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 2021/11/12 08:03:04 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2344] fix swagger generator duplicate param model exception bug (#2600)

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 6d39ef8  [SCB-2344] fix swagger generator duplicate param model exception bug (#2600)
6d39ef8 is described below

commit 6d39ef80738df409f63894180a5689691bb5b6ce
Author: fanjiwang <fj...@163.com>
AuthorDate: Fri Nov 12 16:02:53 2021 +0800

    [SCB-2344] fix swagger generator duplicate param model exception bug (#2600)
    
    Co-authored-by: fanjiwang <18...@163.com>
---
 .../client/validation/ValidationServiceClient.java | 23 ++++++++++
 .../jaxrs/server/validation/ValidationService.java |  9 ++++
 .../servicecomb/demo/validator/Teacher.java}       | 50 ++++++++++++----------
 .../apache/servicecomb/swagger/SwaggerUtils.java   | 34 ++++++++++++---
 4 files changed, 87 insertions(+), 29 deletions(-)

diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
index 9616b48..d3d383a 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
@@ -23,6 +23,7 @@ import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.demo.jaxrs.server.validation.ValidationModel;
+import org.apache.servicecomb.demo.validator.Teacher;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
@@ -81,5 +82,27 @@ public class ValidationServiceClient {
       TestMgr.check(Status.BAD_REQUEST, e.getReasonPhrase());
       TestMgr.check(e.getErrorData().toString().contains("Parameter is not valid for operation"), true);
     }
+
+    try {
+      Teacher teacher = new Teacher();
+      teacher.setName("teacher");
+      teacher.setAge("20");
+      Teacher response = template.postForObject(urlPrefix + "/sayTeacherInfo", teacher, Teacher.class);
+      TestMgr.check(response.getName(), "teacher");
+    } catch (InvocationException e) {
+      TestMgr.check(400, e.getStatus().getStatusCode());
+      TestMgr.check(e.getErrorData().toString().contains("must not be blank"), true);
+    }
+
+    try {
+      Teacher teacher = new Teacher();
+      teacher.setAge("20");
+      template.postForObject(urlPrefix + "/sayTeacherInfo", teacher, Teacher.class);
+      TestMgr.fail("Name should not empty");
+    } catch (InvocationException e) {
+      TestMgr.check(400, e.getStatus().getStatusCode());
+      TestMgr.check(e.getErrorData().toString().contains("must not be blank"), true);
+    }
+
   }
 }
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java
index abb8a01..df79b42 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java
@@ -24,7 +24,9 @@ import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
 
+import org.apache.servicecomb.demo.validator.Teacher;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @RestSchema(schemaId = "ValidationService")
 @Path("ValidationService")
@@ -40,4 +42,11 @@ public class ValidationService {
   public String queryValidate(@NotEmpty @QueryParam("name") String name) {
     return name;
   }
+
+  @Path("/sayTeacherInfo")
+  @POST
+  public Teacher sayTeacherInfo(@Valid @RequestBody Teacher teacher) {
+    return teacher;
+  }
+
 }
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/validator/Teacher.java
similarity index 56%
copy from demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java
copy to demo/demo-schema/src/main/java/org/apache/servicecomb/demo/validator/Teacher.java
index abb8a01..c1fc63e 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/validation/ValidationService.java
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/validator/Teacher.java
@@ -15,29 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.demo.jaxrs.server.validation;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotEmpty;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.QueryParam;
-
-import org.apache.servicecomb.provider.rest.common.RestSchema;
-
-@RestSchema(schemaId = "ValidationService")
-@Path("ValidationService")
-public class ValidationService {
-  @Path("/validate")
-  @POST
-  public ValidationModel errorCode(@Valid ValidationModel request) {
-    return request;
-  }
+package org.apache.servicecomb.demo.validator;
+
+import javax.validation.constraints.NotBlank;
+
+public class Teacher {
+
+  @NotBlank
+  private String name;
 
-  @Path("/validateQuery")
-  @GET
-  public String queryValidate(@NotEmpty @QueryParam("name") String name) {
+  private String age;
+
+  public String getName() {
     return name;
   }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getAge() {
+    return age;
+  }
+
+  public void setAge(String age) {
+    this.age = age;
+  }
+
+  @Override
+  public String toString() {
+    return name + " " + age;
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
index d06dc20..2444c59 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/SwaggerUtils.java
@@ -76,6 +76,7 @@ public final class SwaggerUtils {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerUtils.class);
 
+
   private SwaggerUtils() {
   }
 
@@ -210,18 +211,37 @@ public final class SwaggerUtils {
     if (javaType.isTypeOrSubTypeOf(DynamicEnum.class)) {
       return;
     }
-
     Map<String, Model> models = ModelConverters.getInstance().readAll(javaType);
     for (Entry<String, Model> entry : models.entrySet()) {
-      if (null != swagger.getDefinitions()) {
-        Model tempModel = swagger.getDefinitions().get(entry.getKey());
-        if (null != tempModel && !tempModel.equals(entry.getValue())) {
-          LOGGER.warn("duplicate param model: " + entry.getKey());
-          throw new IllegalArgumentException("duplicate param model: " + entry.getKey());
-        }
+      if (!modelNotDuplicate(swagger, entry)) {
+        LOGGER.warn("duplicate param model: " + entry.getKey());
+        throw new IllegalArgumentException("duplicate param model: " + entry.getKey());
       }
+    }
+  }
+
+  private static boolean modelNotDuplicate(Swagger swagger, Entry<String, Model> entry) {
+    if (null == swagger.getDefinitions()) {
       swagger.addDefinition(entry.getKey(), entry.getValue());
+      return true;
+    }
+    Model tempModel = swagger.getDefinitions().get(entry.getKey());
+    if (null != tempModel && !tempModel.equals(entry.getValue())) {
+      if (modelOfClassNotDuplicate(tempModel, entry.getValue())) {
+        swagger.addDefinition(entry.getKey(), tempModel);
+        return true;
+      } else {
+        return false;
+      }
     }
+    swagger.addDefinition(entry.getKey(), entry.getValue());
+    return true;
+  }
+
+  private static boolean modelOfClassNotDuplicate(Model tempModel, Model model) {
+    String tempModelClass = (String) tempModel.getVendorExtensions().get(SwaggerConst.EXT_JAVA_CLASS);
+    String modelClass = (String) model.getVendorExtensions().get(SwaggerConst.EXT_JAVA_CLASS);
+    return tempModelClass.equals(modelClass);
   }
 
   public static void setParameterType(Swagger swagger, JavaType type, AbstractSerializableParameter<?> parameter) {