You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2020/07/06 13:33:17 UTC

[servicecomb-java-chassis] 01/02: [SCB-2031] fix the problem in mapping pojo consumer method to swagger provider operation

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

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

commit 51f0c501d9e6e0522cb7816a6f4dcb706103d4aa
Author: yhs0092 <yh...@163.com>
AuthorDate: Thu Jul 2 20:41:14 2020 +0800

    [SCB-2031] fix the problem in mapping pojo consumer method to swagger provider operation
---
 .../it/testcase/TestApiOperationOverride.java      | 171 +++++++++++++++++----
 .../it/schema/ApiOperationJaxrsSchema.java         |   4 +-
 .../it/schema/ApiOperationSpringmvcSchema.java     |   5 +-
 .../it/schema/ApiOpertionPojoSchema.java           |   4 +-
 .../apache/servicecomb/provider/pojo/Invoker.java  |   3 +-
 .../provider/pojo/definition/PojoConsumerMeta.java |   9 +-
 .../swagger/engine/SwaggerConsumer.java            |   7 +-
 7 files changed, 163 insertions(+), 40 deletions(-)

diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestApiOperationOverride.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestApiOperationOverride.java
index 8fcf1bc..b55c1b1 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestApiOperationOverride.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestApiOperationOverride.java
@@ -18,18 +18,19 @@ package org.apache.servicecomb.it.testcase;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.servicecomb.it.Consumers;
 import org.junit.Assert;
 import org.junit.Test;
+import org.springframework.http.ResponseEntity;
 
 import io.swagger.annotations.ApiOperation;
 
 public class TestApiOperationOverride {
   interface OptionalIntf {
-
     @ApiOperation(value = "", nickname = "sayHi")
-    String sayHello();
+    String sayHello(Long index);
 
     @ApiOperation(value = "", nickname = "sayHello")
     String sayHello(String name);
@@ -38,9 +39,23 @@ public class TestApiOperationOverride {
     CompletableFuture<String> sayHelloAsync(String name);
 
     @ApiOperation(value = "", nickname = "sayHi")
-    CompletableFuture<String> sayHelloAsync();
+    CompletableFuture<String> sayHelloAsync(Long index);
+
+    @ApiOperation(value = "", nickname = "sayHi")
+    ResponseEntity<String> sayHelloEntity(Long index);
+
+    @ApiOperation(value = "", nickname = "sayHello")
+    ResponseEntity<String> sayHelloEntity(String name);
+
+    @ApiOperation(value = "", nickname = "sayHi")
+    CompletableFuture<ResponseEntity<String>> sayHelloEntityAsync(Long index);
+
+    @ApiOperation(value = "", nickname = "sayHello")
+    CompletableFuture<ResponseEntity<String>> sayHelloEntityAsync(String name);
   }
 
+  private static AtomicLong indexGenerator = new AtomicLong();
+
   private static Consumers<OptionalIntf> consumersPojo = new Consumers<>("apiOpertionPojoSchemaTest",
       OptionalIntf.class);
 
@@ -51,62 +66,164 @@ public class TestApiOperationOverride {
       OptionalIntf.class);
 
   @Test
-  public void consumersPojo_A_intf() {
-    Assert.assertEquals("ApiOpertionPojoSchema#sayHello", consumersPojo.getIntf().sayHello());
+  public void consumersPojo_sayHi_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOpertionPojoSchema#sayHello" + index, consumersPojo.getIntf().sayHello(index));
+  }
+
+  @Test
+  public void consumersPojo_sayHello_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersPojo.getIntf().sayHello("value" + index));
+  }
+
+  @Test
+  public void consumersPojo_sayHelloAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersPojo.getIntf().sayHelloAsync("value" + index).get());
+  }
+
+  @Test
+  public void consumersPojo_sayHiAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOpertionPojoSchema#sayHello" + index, consumersPojo.getIntf().sayHelloAsync(index).get());
+  }
+
+  @Test
+  public void consumersPojo_sayHiEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOpertionPojoSchema#sayHello" + index,
+        consumersPojo.getIntf().sayHelloEntity(index).getBody());
+  }
+
+  @Test
+  public void consumersPojo_sayHelloEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersPojo.getIntf().sayHelloEntity("value" + index).getBody());
+  }
+
+  @Test
+  public void consumersPojo_sayHiEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOpertionPojoSchema#sayHello" + index,
+        consumersPojo.getIntf().sayHelloEntityAsync(index).get().getBody());
+  }
+
+  @Test
+  public void consumersPojo_sayHelloEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersPojo.getIntf().sayHelloEntityAsync("value" + index).get().getBody());
+  }
+
+  @Test
+  public void consumersJaxrs_sayHi_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationJaxrsSchema#sayHello" + index, consumersJaxrs.getIntf().sayHello(index));
+  }
+
+  @Test
+  public void consumersJaxrs_sayHello_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersJaxrs.getIntf().sayHello("value" + index));
+  }
+
+  @Test
+  public void consumersJaxrs_sayHelloAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersJaxrs.getIntf().sayHelloAsync("value" + index).get());
+  }
+
+  @Test
+  public void consumersJaxrs_sayHiAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert
+        .assertEquals("ApiOperationJaxrsSchema#sayHello" + index, consumersJaxrs.getIntf().sayHelloAsync(index).get());
+  }
+
+  @Test
+  public void consumersJaxrs_sayHiEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationJaxrsSchema#sayHello" + index,
+        consumersJaxrs.getIntf().sayHelloEntity(index).getBody());
   }
 
   @Test
-  public void consumersPojo_B_intf() {
-    Assert.assertEquals("value", consumersPojo.getIntf().sayHello("value"));
+  public void consumersJaxrs_sayHelloEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersJaxrs.getIntf().sayHelloEntity("value" + index).getBody());
   }
 
   @Test
-  public void consumersPojo_C_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("value", consumersPojo.getIntf().sayHelloAsync("value").get());
+  public void consumersJaxrs_sayHiEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationJaxrsSchema#sayHello" + index,
+        consumersJaxrs.getIntf().sayHelloEntityAsync(index).get().getBody());
   }
 
   @Test
-  public void consumersPojo_D_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("ApiOpertionPojoSchema#sayHello", consumersPojo.getIntf().sayHelloAsync().get());
+  public void consumersJaxrs_sayHelloEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersJaxrs.getIntf().sayHelloEntityAsync("value" + index).get().getBody());
   }
 
   @Test
-  public void consumersJaxrs_A_intf() {
-    Assert.assertEquals("ApiOperationJaxrsSchema#sayHello", consumersJaxrs.getIntf().sayHello());
+  public void consumersSpringmvc_sayHi_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello" + index, consumersSpringmvc.getIntf().sayHello(index));
   }
 
   @Test
-  public void consumersJaxrs_B_intf() {
-    Assert.assertEquals("value", consumersJaxrs.getIntf().sayHello("value"));
+  public void consumersSpringmvc_sayHello_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersSpringmvc.getIntf().sayHello("value" + index));
   }
 
   @Test
-  public void consumersJaxrs_C_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("value", consumersJaxrs.getIntf().sayHelloAsync("value").get());
+  public void consumersSpringmvc_sayHelloAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index, consumersSpringmvc.getIntf().sayHelloAsync("value" + index).get());
   }
 
   @Test
-  public void consumersJaxrs_D_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("ApiOperationJaxrsSchema#sayHello", consumersJaxrs.getIntf().sayHelloAsync().get());
+  public void consumersSpringmvc_sayHiAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello" + index,
+        consumersSpringmvc.getIntf().sayHelloAsync(index).get());
   }
 
   @Test
-  public void consumersSpringmvc_A_intf() {
-    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello", consumersSpringmvc.getIntf().sayHello());
+  public void consumersSpringmvc_sayHiEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello" + index,
+        consumersSpringmvc.getIntf().sayHelloEntity(index).getBody());
   }
 
   @Test
-  public void consumersSpringmvc_B_intf() {
-    Assert.assertEquals("value", consumersSpringmvc.getIntf().sayHello("value"));
+  public void consumersSpringmvc_sayHelloEntity_intf() {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersSpringmvc.getIntf().sayHelloEntity("value" + index).getBody());
   }
 
   @Test
-  public void consumersSpringmvc_C_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("value", consumersSpringmvc.getIntf().sayHelloAsync("value").get());
+  public void consumersSpringmvc_sayHiEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello" + index,
+        consumersSpringmvc.getIntf().sayHelloEntityAsync(index).get().getBody());
   }
 
   @Test
-  public void consumersSpringmvc_D_intf() throws ExecutionException, InterruptedException {
-    Assert.assertEquals("ApiOperationSpringmvcSchema#sayHello", consumersSpringmvc.getIntf().sayHelloAsync().get());
+  public void consumersSpringmvc_sayHelloEntityAsync_intf() throws ExecutionException, InterruptedException {
+    long index = generateIndex();
+    Assert.assertEquals("value" + index,
+        consumersSpringmvc.getIntf().sayHelloEntityAsync("value" + index).get().getBody());
+  }
+
+  private long generateIndex() {
+    return indexGenerator.getAndIncrement();
   }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java
index a0050be..35bb3c4 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationJaxrsSchema.java
@@ -33,8 +33,8 @@ public class ApiOperationJaxrsSchema {
   @GET
   @Produces("text/plain;charset=UTF-8")
   @ApiOperation(value = "", nickname = "sayHi")
-  public String sayHello() {
-    return "ApiOperationJaxrsSchema#sayHello";
+  public String sayHello(Long index) {
+    return "ApiOperationJaxrsSchema#sayHello" + index;
   }
 
   @Path("/sayHello")
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringmvcSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringmvcSchema.java
index 9deaa32..1f0a327 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringmvcSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOperationSpringmvcSchema.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.it.schema;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import io.swagger.annotations.ApiOperation;
 
@@ -28,8 +29,8 @@ public class ApiOperationSpringmvcSchema {
 
   @RequestMapping(path = "/sayHi", method = RequestMethod.GET, produces = "text/plain;charset=UTF-8")
   @ApiOperation(value = "", nickname = "sayHi")
-  public String sayHello() {
-    return "ApiOperationSpringmvcSchema#sayHello";
+  public String sayHello(@RequestParam("index") Long index) {
+    return "ApiOperationSpringmvcSchema#sayHello" + index;
   }
 
   @RequestMapping(path = "/sayHello", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOpertionPojoSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOpertionPojoSchema.java
index 61f4979..02ff1b9 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOpertionPojoSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ApiOpertionPojoSchema.java
@@ -24,8 +24,8 @@ import io.swagger.annotations.ApiOperation;
 public class ApiOpertionPojoSchema {
 
   @ApiOperation(value = "", nickname = "sayHi")
-  public String sayHello() {
-    return "ApiOpertionPojoSchema#sayHello";
+  public String sayHello(Long index) {
+    return "ApiOpertionPojoSchema#sayHello" + index;
   }
 
   @ApiOperation(value = "", nickname = "sayHello")
diff --git a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
index 751e5a8..8f3ff3a 100644
--- a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
+++ b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/Invoker.java
@@ -41,7 +41,6 @@ import org.apache.servicecomb.provider.pojo.definition.PojoConsumerMeta;
 import org.apache.servicecomb.provider.pojo.definition.PojoConsumerOperationMeta;
 import org.apache.servicecomb.swagger.engine.SwaggerConsumer;
 import org.apache.servicecomb.swagger.engine.SwaggerConsumerOperation;
-import org.apache.servicecomb.swagger.generator.core.utils.MethodUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.context.InvocationContextCompletableFuture;
 import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
@@ -149,7 +148,7 @@ public class Invoker implements InvocationHandler {
     }
 
     PojoConsumerOperationMeta pojoConsumerOperationMeta = consumerMeta
-        .findOperationMeta(MethodUtils.findSwaggerMethodName(method));
+        .findOperationMeta(method);
     if (pojoConsumerOperationMeta == null) {
       throw new IllegalStateException(
           String.format(
diff --git a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
index 669698b..502ebe5 100644
--- a/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
+++ b/providers/provider-pojo/src/main/java/org/apache/servicecomb/provider/pojo/definition/PojoConsumerMeta.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.provider.pojo.definition;
 
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -33,7 +34,7 @@ public class PojoConsumerMeta {
 
   private SchemaMeta schemaMeta;
 
-  private Map<String, PojoConsumerOperationMeta> operationMetas = new HashMap<>();
+  private Map<Method, PojoConsumerOperationMeta> operationMetas = new HashMap<>();
 
   public PojoConsumerMeta(MicroserviceReferenceConfig microserviceReferenceConfig, SwaggerConsumer swaggerConsumer,
       SchemaMeta schemaMeta) {
@@ -53,7 +54,7 @@ public class PojoConsumerMeta {
       PojoConsumerOperationMeta pojoConsumerOperationMeta = new PojoConsumerOperationMeta(this, operationMeta,
           swaggerConsumerOperation, intfSwaggerGenerator.getSwagger(), intfOperationGenerator.getOperation());
 
-      operationMetas.put(swaggerConsumerOperation.getSchemaOperationId(),
+      operationMetas.put(swaggerConsumerOperation.getConsumerMethod(),
           pojoConsumerOperationMeta);
     }
   }
@@ -77,4 +78,8 @@ public class PojoConsumerMeta {
   public PojoConsumerOperationMeta findOperationMeta(String consumerMethodName) {
     return operationMetas.get(consumerMethodName);
   }
+
+  public PojoConsumerOperationMeta findOperationMeta(Method consumerMethod) {
+    return operationMetas.get(consumerMethod);
+  }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerConsumer.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerConsumer.java
index 681397d..83786e9 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerConsumer.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerConsumer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.swagger.engine;
 
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -23,7 +24,7 @@ public class SwaggerConsumer {
   private Class<?> consumerIntf;
 
   // key is consumer method name
-  private Map<String, SwaggerConsumerOperation> operations = new HashMap<>();
+  private Map<Method, SwaggerConsumerOperation> operations = new HashMap<>();
 
   public Class<?> getConsumerIntf() {
     return consumerIntf;
@@ -34,14 +35,14 @@ public class SwaggerConsumer {
   }
 
   public void addOperation(SwaggerConsumerOperation op) {
-    operations.put(op.getSchemaOperationId(), op);
+    operations.put(op.getConsumerMethod(), op);
   }
 
   public SwaggerConsumerOperation findOperation(String consumerMethodName) {
     return operations.get(consumerMethodName);
   }
 
-  public Map<String, SwaggerConsumerOperation> getOperations() {
+  public Map<Method, SwaggerConsumerOperation> getOperations() {
     return operations;
   }
 }