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) {